我的场景如下:
- 应用程序使用配置为显示选项卡的操作栏。
- 一个选项卡显示包含多个 FrameLayouts 的布局,这些 FrameLayouts 被动态替换为 fragment 。其中一些可以有 ListView。这里的例子进行了简化,只有一个fragment直接添加到xml布局中。
- 第一次打开标签时一切正常
- 切换到另一个选项卡并返回将绘制 ListViews,允许滚动但没有点击事件。
如果我添加其他控件,例如列表下方的按钮,它们将按预期工作。此外,使用这些控件后,列表也会开始获取点击事件。
只有当操作栏按钮打开显示其他 fragment 的 fragment 时,这才可重现。如果他们打开列表 fragment ,一切都会按预期进行。
重要的代码是:
开发指南中的选项卡监听器:
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) {
}
}
从操作栏打开的 fragment 的 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;
}
选项卡布局,此处简化为仅显示一个 fragment
<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 不会收到任何调用。与操作栏按钮打开列表的情况相比,这是我发现的唯一区别。不过,我不知道为什么这很重要,也不知道如何解决。
非常感谢任何建议:)
最佳答案
我实现了一个解决方法。不好,也没有解释为什么只有 ListView 中的选择不起作用,而滚动和其他 View 都很好,但它完成了工作。因为在这种情况下没有调用 onCreateView 和 onActivityCreated,所以我强制框架使用 fragment 上的附加/分离来完成它。没有任何明显的性能影响,但我相信存在更好的解决方案。
供引用,代码是:
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();
}
我会将此标记为已接受,因为没有发布其他想法。
关于android - ListView收不到点击事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9609030/