【问题标题】:Call parent fragment method from dialog fragment从对话框片段调用父片段方法
【发布时间】:2014-11-08 04:27:24
【问题描述】:

我在其中有一个父片段。单击按钮后,将创建一个子对话框片段。 现在我想知道如何从子对话框片段中调用父片段函数。

这里是示例代码:

/**SampleFragment.java**/

public class SampleFragment extends Fragment {
    // Instantiate view & add event handlers    

    public void onButtonClick(....) {
        // Create a dialog framgent
    }

    public void refreshView() {

    }
}

/**SampleDialogFragment.java**/

public class SampleDialogFragment extends DialogFragment {
    // Instantiate view for dialog

    public void onButtonClick(...) {
        // Call parent fragment method, i.e call refreshView() of SampleFragment 
    }
}

【问题讨论】:

    标签: java android android-fragments


    【解决方案1】:

    在片段中:

    SampleDialogFragment dialogFragment = new SampleDialogFragment();
    dialogFragment.show(getChildFragmentManager());
    

    在 DialogFragment 中:

    ((SampleFragment) getParentFragment()).refreshView();
    

    调用此方法后,您可以访问父片段的公共方法。

    【讨论】:

    • getParentFragment() 对我来说是 NULL :(
    • @Joonsoo 在这种情况下,您不会在子片段类中调用此方法,层次结构应该是 Activity->ParentFragment->ChildFragment 并且在“ChildFragment”中您必须编写此代码。这是访问父类的简单类型转换。
    • 关键是使用getChildFragmentManager,而不是getFragmentManager
    【解决方案2】:

    比如说你的父片段,例如 SettingsFragment。注意setTargetFragment()

    public void onButtonClick(....)
    {
                PrefLanguageDialogFragment prefLang = PrefLanguageDialogFragment.newInstance();
                prefLang.setTargetFragment(SettingsFragment.this, 1337);
                prefLang.show(getFragmentManager(), "dialog");
    }
    

    在我们的对话框中,注意getTargetFragment()

    SettingsFragment frag = (SettingsFragment)getTargetFragment();
    if(frag != null){
       frag.refreshSomething();
    }
    

    【讨论】:

      【解决方案3】:

      当您想将SampleFragment 添加到您的活动时,请为其设置一个标签,例如“SampleFragment”。

      然后

      public void onButtonClick(...){
      
          FragmentManager fm = getFragmentManager();
          FragmentTransaction ft = fm.beginTransaction();
          SampleFragment parent = (SampleFragment)fm.findFragmentByTag("SampleFragment");
          parent.refreshview();
      }
      

      尚未对其进行测试,但它可能会有所帮助:-)

      【讨论】:

      • 有没有简单的方式比如界面或者其他方式?
      • 你也可以试试getParentFragment()或者callback的思路
      • getParentFragment() 返回 NULL,但您的技术不起作用,似乎回调很好,我不知道该怎么做
      【解决方案4】:

      最好的方法是使用接口,在嵌套片段中声明一个接口 -

      公共接口检查ClickListener { 公共无效检查ClickListener(字符串数据); }

      然后将此接口附加到父片段 -

      public void onAttachFragment(Fragment fragment)
          {
              try
              {
                  clickListener = (checkingClickListener) fragment;
      
              } catch (ClassCastException e)
              {
                    throw new ClassCastException(fragment.toString() + " must implement checkingClickListener");
              }
           }
      
      
           @Override
           public void onCreate(Bundle savedInstanceState)
           {
              Log.i(TAG, "onCreate");
              super.onCreate(savedInstanceState);
      
              this.mContext = getActivity().getApplicationContext();
              onAttachFragment(getParentFragment());
              ....
           }
      

      您需要在单击某个按钮时调用此侦听器 -

      @Override
      public void onClick(View v)
      {
          switch (v.getId())
          {
              case R.id.tv_submit:
                  if (clickListener != null)
                  {                
                      clickListener.checkingClickListener("sending data");
                  }
                  break;
          }
      }
      

      在父片段中实现这个接口 -

      public class Fragment_Parent extends Fragment implements Nested_Fragment.checkingClickListener
      {
            ....
           @Override
           public void checkingClickListener(final List<Player> players_list)
           {
                 FragmentManager fragmentManager = getChildFragmentManager();
                 SomeOtherNestFrag someOtherNestFrag = (SomeOtherNestFrag)  fragmentManager.findFragmentByTag([Tag of your fragment which you should use when you add]);
                 if(someOtherNestFrag != null)
                 {
                      // your some other frag need to provide some data back based on views.
                      SomeData somedata = someOtherNestFrag.getSomeData();
                      // it can be a string, or int, or some custom java object.
                 }
           }
      }
      

      希望对你有所帮助。

      【讨论】:

      • getParentFragment() 对我来说是 NULL :(
      猜你喜欢
      • 2015-05-05
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-09
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      相关资源
      最近更新 更多