我对Androind很新,试图弄清楚片段和活动应该如何协同工作。我有一个非常丑陋的布局。 1活动和1" root"分段。当用户点击左侧菜单片段被片段管理器替换时。
expandableList.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView expandableListView, View view, int i, long l) {
LeftMenuItem group = groups.get(i);
String fragmentTag = group.getFragmentTag();
if (fragmentTag.equals(Fragment1.TAG)) {
Fragment1 fragment = (Fragment1) currentFragmentManager.findFragmentByTag(Fragment1.TAG);
if (fragment == null) {
fragment = new Fragment1();
}
FragmentTransaction ft = currentFragmentManager.beginTransaction();
ft.replace(R.id.root_frame, fragment, Fragment1.TAG);
ft.commitAllowingStateLoss();
} else if (fragmentTag.equals(Fragment2.TAG)) {
我假设上面的代码应该用新的代码替换当前的代码。片段实际上总是为空。我不知道为什么。
在RootFragment的onCreateView中,默认情况下会创建Fragment1。
if (savedInstanceState == null) {
Log.d(TAG, "savedInstanceState is null, creating Framgent1");
Fragment1 fragment = new Fragment1();
FragmentTransaction ft = currentFragmentManager.beginTransaction();
ft.replace(R.id.root_frame, fragment, Fragment1.TAG);
ft.commitAllowingStateLoss();
}
在rootFragment的onCreateView
中,rootFragment将自己替换为另一个Fragment1,这对我来说非常难看。它是众所周知的Androind模式还是只是糟糕的设计?
让我们假设使用Volley从MyActivity的onCreateView发送httpRequest。收到回复后,我需要从回调中更新Fragment1 UI。我该怎么办?
我是否应该尝试在活动中使用findFragmentByTag查找片段并直接更新UI? http volley响应是否在同一个线程中?如果不是,可以从不同的线程更新UI吗?
我应该使用Handler类将消息从Activity发送到片段吗?
答案 0 :(得分:1)
findFragmentByTag因为只要替换就没有用 调用,前一个片段被销毁。如果你只有几个 要切换的片段,可以在解决方案下使用hte:
How can I switch between two fragments, without recreating the fragments each time?
回答问题2的第二部分:
排球响应总是在主线程上被完美地调用 好的,可以在回调上更新UI。您永远不应该更新UI元素 在MAIN / UI线程以外的任何线程上。
你可以选择通过处理程序发送消息,但是如果通常android文档建议通过回调发送活动和附加片段之间的通信
https://developer.android.com/training/basics/fragments/communicating.html