从另一个活动更改文本

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>,如果您只想更改文本)。

当您将实时数据对象从一个ActivityFragment 更改时,所有其他观察此实时数据对象的活动和片段都会收到通知。

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.


此结构将帮助您防止空指针异常。

【讨论】:

以上是关于从另一个活动更改文本的主要内容,如果未能解决你的问题,请参考以下文章

从另一个活动重新创建/重新启动活动

从另一个活动中打开一个活动的片段

从另一个活动返回时,MapFragment 的地图加载滞后

从另一个片段的其他视图控制片段的视图

如何更改从第一个活动单击的按钮上的第二个活动的文本? [科特林]

更改 Android 中活动或非活动选项卡的文本大小