从另一个活动更改文本
Posted
技术标签:
【中文标题】从另一个活动更改文本【英文标题】:Changing text from another activity 【发布时间】:2011-09-30 03:21:47 【问题描述】:如何从屏幕的另一部分动态改变 TextView 的内容?
我有一个 TabActivity 类,它绘制一个包含 TextView 的 RelativeLayout,后跟一个带有多个选项卡的。每个选项卡中都有一个单独的 Intent。从选项卡意图之一,我想从父 TabActvity 更改 TextView 的文本(通过 .setText)。
这可能吗?
【问题讨论】:
【参考方案1】:你应该使用android Architecture Components:
您可以创建一个ViewModel,其中包含您的数据对象的LiveData(LiveData<String>
,如果您只想更改文本)。
当您将实时数据对象从一个Activity
或Fragment
更改时,所有其他观察此实时数据对象的活动和片段都会收到通知。
Official API doc has complete example with description。
【讨论】:
请注意,这将改变堆栈中该类的每个实例的TextView
。
“不要将 Android 上下文类放在静态字段中;这是内存泄漏(也会破坏 Instant Run)”——不再是更好的解决方案。在将其设为静态时,您将在 Android Studio 中收到此警告。有更好的解决方案吗?
给我一个 NullPointerException。 Attempt to invoke virtual method 'void android.widget.TextView.setText(int)' on a null object reference
@AneesU 同意,更新过时且不正确的答案:)【参考方案2】:
在您的 TabActivity 中创建一个设置 TextView 文本的公共方法,然后从子 Activity 调用 getParent()
,将其强制转换为您的 TabActivity 类,然后调用该公共方法。
【讨论】:
哇,这是个好主意,将所有内容都保留在 TabActivity 类中。一定会试试这个。【参考方案3】:您可以尝试为执行该工作的父选项卡实现一个处理程序。从您各自的每个选项卡传递消息对象中的文本。为了安全起见,请在 runOnUI 块内的处理程序中进行更改
【讨论】:
谢谢...我确实想过并尝试了它,但可能实现不正确。好建议。【参考方案4】:在从 asynctask 文件中更改文本的情况下,您需要实现一个带有侦听器的接口。示例:
异步任务文件:
OnReadyListener onReadyListener;
public class ABCAsynctaskFile
...
onReadyListener.onReady();
public interface OnReadyListener
void onReady();
public void setOnReadyListener(OnReadyListener onReadyListener)
this.onReadyListener = onReadyListener;
活动文件:
public class ABC extends AppCompactActivity implements ABCAsynctaskFile.OnReadyListener
..
ABCAsynctaskFile aBCAsynctaskFileObj = new ABCAsynctaskFile(context);
aBCAsynctaskFile.setOnReadyListener(ABC.this)
@Override
public void onReady()
// Your wished changed in edit text.
此结构将帮助您防止空指针异常。
【讨论】:
以上是关于从另一个活动更改文本的主要内容,如果未能解决你的问题,请参考以下文章