繁体   English   中英

从对话框片段调用父片段方法

[英]Call parent fragment method from dialog fragment

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

以下是示例代码:

/**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 
    }
}

比如你的父片段,例如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();
}

片段中:

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

在DialogFragment中:

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

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

当你想为你的活动添加SampleFragment ,设置一个标签,例如“SampleFragment”。

然后

public void onButtonClick(...){

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

没有测试但它可能有帮助:-)

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

public interface checkingClickListener {public void checkingClickListener(String data); }

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

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.
           }
     }
}

希望这对你有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM