我的情景如下:
- 应用程序使用配置为显示选项卡的操作栏
- 一个选项卡显示包含多个FrameLayouts的布局,这些FrameLayouts由片段动态替换。其中一些可以有ListViews。此处的示例已简化,并且在xml布局中只直接添加了一个片段
- 第一次打开标签时一切正常
- 切换到另一个选项卡并返回将绘制ListViews,允许滚动但没有点击事件。
如果我添加其他控件,例如列表下的按钮,它们将按预期工作。此外,在使用这些控件后,列表也将开始获取点击事件
仅当操作栏按钮打开显示其他片段的片段时,才可以重现此问题。如果他们打开列表片段,一切都按预期工作。
重要的代码是:
开发指南中的标签监听器:
public static class TabListener<T extends Fragment> implements ActionBar.TabListener {
private Fragment mFragment;
private final Activity mActivity;
private final String mTag;
private final Class<T> mClass;
public TabListener(Activity activity, String tag, Class<T> clz) {
mActivity = activity;
mTag = tag;
mClass = clz;
}
public void onTabSelected(Tab tab, FragmentTransaction ft) {
if (mFragment == null) {
mFragment = Fragment.instantiate(mActivity, mClass.getName());
ft.add(android.R.id.content, mFragment, mTag);
} else {
ft.attach(mFragment);
}
}
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
if (mFragment != null) {
ft.detach(mFragment);
}
}
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
}
从操作栏打开的片段中的onCreateView方法:
View view = null;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (view == null) {
view = inflater.inflate(R.layout.tab, null);
}
return view;
}
标签布局,此处简化为仅显示片段
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<fragment
android:id="@+id/runModesListFragment"
android:name="tab.fail.TabFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</fragment>
</LinearLayout>
最后,列表
public class TabFragment extends ListFragment {
String[] listContent = {
"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16",
"17"
};
View view = null;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (view == null) {
view = inflater.inflate(R.layout.tab_layout, null);
}
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, listContent);
getListView().setAdapter(adapter);
}
}
在onCreateView和onActivityCreated上再次选中该标签时,不会接到任何电话。与操作栏按钮打开列表的情况相比,这是我发现的唯一区别。不过,我不知道为什么这很重要,也不知道如何解决它。
非常感谢任何建议:)
答案 0 :(得分:1)
我实施了一种解决方法。不好,并没有解释为什么只有ListView中的选择不起作用,而滚动和其他视图都很好但它完成了工作。因为在这种情况下没有调用onCreateView和onActivityCreated,所以我强制框架使用片段上的attach / detach来完成它。没有任何明显的性能影响,但我确信存在更好的解决方案。
供参考,代码为:
Fragment frag = getFragmentManager().findFragmentById(R.id.tabFragment);
if (frag == null) {
frag = new TabFragment();
final FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.tabFragment, frag);
ft.commit();
} else {
final FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.detach(frag);
ft.attach(frag);
ft.commit();
}
我会将此标记为已接受,因为没有其他想法发布。