ListView不会收到点击事件

时间:2012-03-07 21:04:54

标签: android android-fragments android-actionbar

我的情景如下:
- 应用程序使用配置为显示选项卡的操作栏 - 一个选项卡显示包含多个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上再次选中该标签时,不会接到任何电话。与操作栏按钮打开列表的情况相比,这是我发现的唯一区别。不过,我不知道为什么这很重要,也不知道如何解决它。

非常感谢任何建议:)

1 个答案:

答案 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();
    }

我会将此标记为已接受,因为没有其他想法发布。