如何在 Fragment 中访问父 Activity 的视图

75

我有一个 ActionBarActivity 和一个碎片。我正在使用提供碎片的 FragmentPagerAdapter 应用程序。我的问题是如何在碎片中访问父活动视图?

5个回答

190

您可以使用

View view = getActivity().findViewById(R.id.viewid);

引用文档

具体来说,该片段可以使用getActivity()访问Activity实例,并轻松执行诸如在活动布局中查找视图之类的任务。


1
欢迎您也使用接口方式进行通信。 - Raghunandan
6
是的,谁知道情况会怎样,虽然我知道这有些草率,但我得去吃午饭了。 - Kevin Parker
1
很酷,只需要检查Fragment是否已通过isAdded()添加,以避免在活动尚未附加时崩溃。 - Maher Abuthraa
@Raghunandan。如果我旋转设备,它就无法工作。那时视图会变为空,我会得到一个NPE。 - zulkarnain shah
2
Android文档写得非常愚蠢。文档引用为“具体而言,片段可以使用getActivity()访问Activity实例,并轻松执行诸如在活动布局中查找视图之类的任务”,但是Android Studio警告显示为“getActivity()可能为空”。 - Farid
显示剩余9条评论

9

首先,创建这样的视图:

View view = getActivity().findViewById(R.id.viewid);

然后,您可以像这样将其转换为所需的任何视图:
 if( view instanceof EditText ) {
            editText = (EditText) view;
            editText.setText("edittext");
            //Do your stuff
        }

或者

if( view instanceof TextView ) {
  TextView textView = (TextView) view;
  //Do your stuff
}

9
在 Kotlin 中,非常容易在 Fragment 中访问父 Activity 的视图。
activity!!.textview.setText("String")

2
请注意,如果您从活动中使用findViewById<>(),则如果您从片段中调用它,则无法正常工作。您需要将视图分配给变量。这是我的情况

这不起作用

class MainActivity{

    fun onCreate(...){
        //works
        setMyText("Set from mainActivity")
    }

    fun setMyText(s: String){
        findViewById<TextView>(R.id.myText).text = s
    }
}
________________________________________________________________

class ProfileFragment{
    ...

    fun fetchData(){
        // doesn't work
        (activity as MainActivity).setMyText("Set from profileFragment")
    }
}

这个有效

class MainActivity{

    private lateinit var myText: TextView

    fun onCreate(...){
        myText = findViewById(R.id.myText)

        // works
        setMyText("Set from mainActivity")
    }

    fun setMyText(s: String){
        myText.text = s
    }
}
________________________________________________________________

class ProfileFragment{
    ...

    fun fetchData(){
        // works
        (activity as MainActivity).setMyText("Set from profileFragment")
    }
}

2

如果您正在使用Kotlin,则可以使用以下语法:

val view= requireActivity().findViewById<YourVIEW>(R.id.view_id)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接