1

我意识到,有时在此期间安装事件侦听器是onCreateView行不通的。例如,我以安装列表视图的点击监听器ListFragment为例

不工作

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    ListView listView = (ListView)v.findViewById(android.R.id.list);
    // Won't work?! Listener will not be triggered.
    listView.setOnItemClickListener(new ListViewOnItemClickListener()); 
    // Installing long click listener does work somehow...

作品!

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    // Works!
    this.getListView().setOnItemClickListener(new ListViewOnItemClickListener());  

我想知道,在 onCreateView 期间安装事件侦听器是否错误?因为我没有发现文档中提到了这一点。

4

2 回答 2

2

我认为在onCreateView中设置监听器并没有错。您的代码可能还有其他问题。(需要更多细节来说明您的代码有什么问题。)

以下是 Android SDK 附带的示例代码。(内容片段.java)

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    mContentView = inflater.inflate(R.layout.content_welcome, null);
    final ImageView imageView = (ImageView) mContentView.findViewById(R.id.image);
    mContentView.setDrawingCacheEnabled(false);

    // Handle drag events when a list item is dragged into the view
    mContentView.setOnDragListener(new View.OnDragListener() {
        public boolean onDrag(View view, DragEvent event) {
            switch (event.getAction()) {
                case DragEvent.ACTION_DRAG_ENTERED:
                    view.setBackgroundColor(
                            getResources().getColor(R.color.drag_active_color));
                    break;

                case DragEvent.ACTION_DRAG_EXITED:
                    view.setBackgroundColor(Color.TRANSPARENT);
                    break;

                case DragEvent.ACTION_DRAG_STARTED:
                    return processDragStarted(event);

                case DragEvent.ACTION_DROP:
                    view.setBackgroundColor(Color.TRANSPARENT);
                    return processDrop(event, imageView);
            }
            return false;
        }
    });

    // Show/hide the system status bar when single-clicking a photo.
    mContentView.setOnClickListener(new OnClickListener() {
        public void onClick(View view) {
            if (mCurrentActionMode != null) {
              // If we're in an action mode, don't toggle the action bar
              return;
            }

            if (mSystemUiVisible) {
              setSystemUiVisible(false);
            } else {
              setSystemUiVisible(true);
            }
        }
    });

    // When long-pressing a photo, activate the action mode for selection, showing the
    // contextual action bar (CAB).
    mContentView.setOnLongClickListener(new View.OnLongClickListener() {
        public boolean onLongClick(View view) {
            if (mCurrentActionMode != null) {
                return false;
            }

            mCurrentActionMode = getActivity().startActionMode(
                    mContentSelectionActionModeCallback);
            view.setSelected(true);
            return true;
        }
    });

    return mContentView;
}
于 2013-04-04T20:15:37.210 回答
0

好吧,这取决于您的逻辑需要什么,如果您在事件侦听器逻辑中调用 getActivity() 那么它肯定应该在 onActivityCreated 方法中(即,如果您在加载某些内容时使用进度对话框,Toast 消息,AsyncTask 与 onPreExecute 中的一些逻辑和onPostExecute),因为只有在 onActivityCreated 之后,您才能确定 getActivity() 不会返回 null,否则在 onCreateView 中设置事件侦听器可能没问题。上述逻辑也不要使用 onAttach(Activity activity) ,因为这里我们只能获取对activity的引用,这并不意味着持有fragment的activity已经完全创建并且可以正常工作,只有在onActivityCreated之后才能完全正常工作叫做

于 2015-04-16T08:30:22.100 回答