我在将我的Android应用中的子片段添加到另一个片段时遇到了问题。
在父片段中我有这样的东西:
@Override
public View onCreateView(blah) {
Thread initializeStateThread = new Thead() {
public void run() {
// Make some requests to get some data that determines
// which child fragment to display
state = // Some state that corresponds to a child frag
// Method that set's the child fragment based on |state|
setChildFragment(state);
}
}
initializeStateThread.start()
// Do a bunch of other stuff
return view;
}
setChildFragment(State state) {
Fragment fragment = null;
switch (mState) {
case CASE_1:
fragment = new DriverFindSpotFragment();
break;
case CASE_2:
fragment = new DriverNavigationFragment();
break;
case CASE_3:
fragment = new DriverArriveSpotFragment();
break;
}
getActivity().runOnUiThread(new Runnable() {
@Ovverride
public void run() {
getChildFragmentManager().beginTransaction().
replace(R.id.driver_fragment_container, fragment).commit();
};
}
但是,这只占50%的时间。儿童片段的其他50%的时间都没有出现(没有错误或任何事情)。我认为问题与我在尝试在onCreateView上返回父视图后添加子片段这一事实有关。
我注意到如果我强制主线程休眠一两秒,问题就会消失(我假设因为在这种情况下返回视图之前子片段已设置)。
有没有人遇到过类似的问题?或者任何人都可以证实我的理论为什么会出现这个问题?
答案 0 :(得分:0)
您可以尝试按照以下方法在片段中定义它并替换为位置/状态
public void displayView(int position) {
Fragment fragment = null;
switch (position) {
case 0:
fragment = new FormFragment();
break;
case 1:
fragment = new HomeFragment();
break;
}
if (fragment != null) {
FragmentManager fragmentManager = getChildFragmentManager();
FragmentTransaction transaction = fragmentManager
.beginTransaction();
if (position != 0)
// transaction.addToBackStack("back");
transaction.replace(R.id.main_ll_container, fragment).commit();
} else {
Log.e("MainActivity", "Error in creating fragment");
}
}
答案 1 :(得分:0)
尝试在主线程中添加Fragment事务。
喜欢这样:
runOnUiThread(new Runnable() {
@Override
public void run() {
getChildFragmentManager().beginTransaction().replace(R.id.driver_fragment_container, fragment).commit();
}
});
答案 2 :(得分:0)
在阅读评论和其他答案后,我不确定实际问题是什么以及在哪里。
而不是:
getActivity().runOnUiThread(new Runnable() {
@Ovverride
public void run() {
}
});
使用:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Ovverride
public void run() {
}
});
这只是一个疯狂的猜测,很可能会起作用。