片段沟通:哪种方法更好?

时间:2018-01-09 12:27:49

标签: android android-fragments fragmentmanager

我正在研究活动堆栈中多个片段之间的通信。 我已经找到了两种方法来做到这一点。

  1. 通过接口
  2. 通过Bundle setarguments

    Bundle bundle = new Bundle();
    bundle.putBoolean("Status",trur);
    Fragment fragment = getFragmentManager().findFragmentByTag(bottomfragment.class.getName());
    if(fragment!=null) {
        fragment.setArguments(bundle);
    }
    
  3. 我认为第二种方法很容易。因为谷歌建议采用第一种方法 任何人都可以通过第二种方法帮助我解决我可能面临的问题。

3 个答案:

答案 0 :(得分:0)

你正在混合这两种方式。 1.通过接口,如果你想从片段到活动或片段到片段(通过活动)进行通信 2. set参数是你想在启动片段时传递参数。你可以使用从片段id / tag获得的实例来调用片段的方法 请参阅fragment communication

答案 1 :(得分:0)

尝试在这两个片段之间进行通信:

1)创建如下界面:

public interface FragmentChangeListener {
    void changeFragment(Fragment fragment);
}

2)像这样更新MainActivity:

public class MainActivity extends AppCompatActivity implements FragmentChangeListener
{
//Activity code
------
 @Override
    public void changeFragment(Fragment fragment) {
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction tr = fm.beginTransaction();
    tr.replace(R.id.frame_container, fragment);
    tr.commitAllowingStateLoss();
 }

}

3)创建第一个片段:

public class FirstFragment extends Fragment
{
 // call another freagment like this
//in your oncreateview method:
 SecondFragment
 Bundle b = new Bundle();
            b.putSerializable(SELECTED_ITEM, true);
            SecondFragment second =  SecondFragment.newInstance(b);

 FragmentChangeListener fc = (FragmentChangeListener) getActivity();
 fc.changeFragment(second);
}

4)第二片段:

public class SecondFragment extends Fragment
{
    public static SecondFragment newInstance(Bundle bundle) {
        SecondFragment fragment = new SecondFragment();
        if (bundle != null)
            fragment.setArguments(bundle);
    return fragment;
    }
//another fragment related code
//In your OncreateView like this:
if (getArguments() != null)
            boolean temp = getArguments().getBoolean(IntentParameter.SELECTED_ITEM);
    }

希望这个解释可以帮助你:)

答案 2 :(得分:0)

参数(Bundle)只应在最初(Fragment的对象由默认构造函数创建时)传递给Fragment。在已添加的setArguments上调用Fragment方法将导致IllegalStateException。请参阅setArguments方法的正文:

public void setArguments(Bundle args) {
       if (mIndex >= 0 && isStateSaved()) {
           throw new IllegalStateException("Fragment already active and state has been saved");
       }
            mArguments = args;
}

如果您想更改Fragment A Fragment B 的内容:

a)使用

B 内获取 A 的对象

getFragmentManager().findFragmentByTag("FRAGMENT_A_TAG");

或者

getFragmentManager().findFragmentById(FRAGMENT_A_CONTAINER_ID);

将返回的对象强制转换为 A 并在其上调用正确的方法。 (这是最简单的方法,但在此之后, A B 变得高度耦合);

b)或者,您可以在Activity的方法中编写提到的逻辑,其中包含这2个Fragment s,在 B 中获取此Activity的引用使用getContext()投放到容器Activity并在其上调用上述方法(它会导致可重用性,因为如果您希望在其他方面拥有 A B Activity,施放getContext()会导致ClassCastException);

c)在Fragment之间进行通信的最佳方式是创建interface,通过此Activity实现容器interface,获取此interface的引用在 B 里面并调用正确的方法。 (您可以通过此界面实现任意数量的活动,因此它是可重用的方法, A B 松散耦合)。