【问题标题】:How to access parent Activity View in Fragment如何在 Fragment 中访问父 Activity 视图
【发布时间】:2014-05-17 23:52:43
【问题描述】:

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

【问题讨论】:

    标签: android android-fragments fragment


    【解决方案1】:

    你可以使用

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

    引用文档

    具体来说,fragment 可以通过以下方式访问 Activity 实例 getActivity() 并轻松执行任务,例如在 活动布局

    【讨论】:

    • 有效,但我会使用接口与活动或类似的东西进行通信。
    • 欢迎您也使用界面方式。但那是为了与活动交流
    • 是的,谁知道状态会怎样,我知道,但我有午餐要吃。
    • 酷,只是您需要检查是否通过 isAdded() 添加了 Fragment 以避免在尚未附加活动时崩溃。
    • Android 文档的编写方式非常愚蠢。引用为 Specifically, the fragment can access the Activity instance with getActivity() and easily perform tasks such as find a view in the activity layout 的文档,但 Android Studio 警告显示为 getActivity() may be null
    【解决方案2】:

    在 Kotlin 中,很容易在 Fragment 中访问父 Activity 视图

    activity!!.textview.setText("String")
    

    【讨论】:

      【解决方案3】:

      首先,创建一个像这样的视图:

      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
      }
      

      【讨论】:

        【解决方案4】:

        请注意,如果您从活动中使用 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")
            }
        }
        

        【讨论】:

          【解决方案5】:

          如果你使用的是 kotlin,那么你可以使用这个语法

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-03-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-12-23
            • 1970-01-01
            • 2012-07-21
            相关资源
            最近更新 更多