java - 从 Activity 访问 Fragment 的 View

标签 java android android-fragments android-view

我是android开发新手,我想制作简单的应用程序。我有一个 Activity MainActivity ,并且该 Activity 内部有一个 fragment MainFragment 。我想从 Activity onCreate 和/或 onResume 更改此 fragment 的 TextView。然而,我无法处理这个问题。我的 Activity 的 onCreate 方法是:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new MainFragment()).commit();
    }

    TextView tv = (TextView) getSupportFragmentManager().findFragmentById(R.layout.fragment_main).getView().findViewById(R.id.textView1);

}

我在此处获取 TextView 时遇到 NullPointerException。我假设它无法通过 findFragmentById(R.layout.fragment_main) 找到 fragment 。因为我有fragment_main.xml,它是:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.deneme.MainFragment" >

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="TextView" />
</RelativeLayout>

我的 MainFragment 类的 onCreateView 方法是:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    rootView = inflater.inflate(R.layout.fragment_main, container, false);

    return rootView;
}

不想在onCreate方法中更改fragment的textview的文本。我想要从 Activity 中改变。我的问题是什么?

谢谢

最佳答案

这里有一些问题需要修复。 正如经验丰富的 Android 人员会告诉您的那样,从 Activity 中更改 Fragment 的 View 并不是一件好事。将 Activity 视为它所创建的 fragment 的“母亲”。如果妈妈开始给 child 做作业,那么 children 会做什么呢? fragment 的 View 只能从 fragment 内部处理,而不是外部。此外,由于该 fragment 可能在屏幕中不可见,因此 Android 内核将决定销毁它并对其进行 GC。如果您继续保留对其 View 的引用,那么这将浪费内存和资源。

但如果你仍然想走那条路:

  • 确保您的 fragment 已使用 fragment 管理器中的 fragment 事务创建并绑定(bind)到父级。在 Activity 对象中保存对 fragment 对象的引用。确保事务已提交。此操作将使 android 调用 Fragment 的 oCreateView ,您可以在其中膨胀 Fragment 的主视图。立即将对主 fragment View 的引用保存在类属性变量中。
  • 随后,如果您想访问 Activity 中 Fragment 的 View ,请在 Activity 中调用 Fragment 对象 View 的 getter,然后就完成了。

但我仍然敦促您让 fragment 进行自己的 View 处理,不要在 Activity 和 fragment 之间混合 View 处理,也不要在两个或多个 fragment 之间混合 View 处理。这是一个很大的设计,不行不行。

关于java - 从 Activity 访问 Fragment 的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23526990/

相关文章:

Android 应用程序在最小化和旋转时崩溃

java - asynctask 刷新后尝试访问适配器时出现 nullPointer 异常

java - 在线程内运行线程, "Class exception error "

c# - 支持混合空格和制表符的编辑器?

java - 如何在android中实现客户端服务器来制作BINGO游戏,但不用于聊天应用程序

java - 在我的 android 项目上添加数字密码字段时出错

android - Application.mk 被 Android Studio 忽略

java - 在android中使用Theme.Light设置ImageButton的背景透明

java - 删除客户端中的有状态 EJB bean

android - RecyclerView ViewPager java.lang.NullPointerException android.support.v7.widget.RecyclerView$ItemAnimator$ItemHolderInfo.left