我正在研究活动堆栈中多个片段之间的通信。 我已经找到了两种方法来做到这一点。
通过Bundle setarguments
Bundle bundle = new Bundle();
bundle.putBoolean("Status",trur);
Fragment fragment = getFragmentManager().findFragmentByTag(bottomfragment.class.getName());
if(fragment!=null) {
fragment.setArguments(bundle);
}
我认为第二种方法很容易。因为谷歌建议采用第一种方法 任何人都可以通过第二种方法帮助我解决我可能面临的问题。
答案 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 松散耦合)。