【问题标题】:onContextItemSelected does not get called in a DialogFragmentonContextItemSelected 不会在 DialogFragment 中调用
【发布时间】:2014-08-29 15:45:47
【问题描述】:

我有一个显示项目列表的对话框,我需要能够编辑/删除此列表中的项目,所以我放了一个上下文菜单,这样当用户长按一个项目时,他们可以选择他们想要的to do(编辑或删除项目)。

问题是onContextItemSelected 在上下文菜单中的项目被选中时永远不会被调用。

我检查了创建对话框片段的活动是否正在获取回调,但那也不是,为什么它没有被调用?不能在对话框中做上下文菜单吗?

public class TypesDialogList extends DialogFragment implements LoaderManager.LoaderCallbacks<Cursor>,OnItemClickListener,OnCreateContextMenuListener{

ListView lv;
SimpleCursorAdapter mAdapter;
private int EDIT_TYPE = 1;
private int DELETE_TYPE = 2;
OnEditType mType;


public Dialog onCreateDialog(Bundle state){
    final View v = getActivity().getLayoutInflater().inflate(R.layout.layer_dialog_layout, null, false);
    lv = (ListView)v.findViewById(R.id.listView1);
    lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
    lv.setOnItemClickListener(this);
    lv.setOnCreateContextMenuListener(this);
    return new AlertDialog.Builder(getActivity()).setView(v).setPositiveButton("Add Type", new OnClickListener(){

        public void onClick(DialogInterface dialog, int which) {

        }

    }).setTitle("Type's").create();
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo){
    super.onCreateContextMenu(menu, v, menuInfo);
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
    long id = info.id;
    if(id > 3){
        menu.setHeaderTitle("Type Menu");
        menu.add(Menu.NONE, EDIT_TYPE, 1, "Edit");
        menu.add(Menu.NONE, DELETE_TYPE, 2, "Delete");
    }else{
        Toast.makeText(getActivity(),"Cannot edit type",Toast.LENGTH_SHORT).show();
    }

}

@Override
public boolean onContextItemSelected(MenuItem item) {
    super.onContextItemSelected(item);
     AdapterView.AdapterContextMenuInfo oMenuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
     long id = oMenuInfo.id;
     if(item.getItemId() == EDIT_TYPE){

     }else if(item.getItemId() == DELETE_TYPE){

     }
     return true;
 }

}

【问题讨论】:

  • 选择下面的答案,它正在工作
  • 可能托管活动有onContextItemSelected 实现,它不调用super。这是我(有点相似)案例中的问题。

标签: android android-dialogfragment android-contextmenu


【解决方案1】:

对于仍在寻找解决方法的任何人,我刚刚通过创建一个匿名的OnMenuItemClickListener 来解决这个问题,该OnMenuItemClickListener 委托回onContextItemSelected(MenuItem item) 并将其设置在我菜单中的所有项目上。

@Override
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) {
    // Creation/inflate menu here

    OnMenuItemClickListener listener = new OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            onContextItemSelected(item);
            return true;
        }
    };

    for (int i = 0, n = menu.size(); i < n; i++)
        menu.getItem(i).setOnMenuItemClickListener(listener);
}

【讨论】:

  • 难以置信...这是框架中的错误还是如果没有这样的解决方法真的不支持?
  • 无论如何,这也是我离开 Android 的另一个原因,我无法使用此解决方法,因为我的对话框在另一个屏幕中用作无对话框片段,这将导致 2 次调用跨度>
  • 这不可能是真的......我刚刚找到了这个,它解决了我为什么没有调用 onContextItemSelected 的问题。+1 你会认为他们会修复它 3 年以上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-10
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多