【问题标题】:Fragment ListView ContextMenu with Dialog带有对话框的片段 ListView ContextMenu
【发布时间】:2015-04-07 03:32:42
【问题描述】:

我有一个ListView,它位于Fragment 中。 ListView 有一个 ContextMenu 用于编辑和删除条目。我正在尝试通过从ContextMenu 中选择EDIT 来启动自定义Dialog,但它不会接受我的代码。到目前为止,我一直在以类似的方式成功使用android.support.v4.app.FragmentManager。给定的响应是Cannot resolve method 'show(android.support.v4.app.FragmentManager, java.lang.String) 任何可以更改的建议或输入都将受到赞赏。提前致谢。

片段:

    public static class FragmentS extends Fragment {

    private ListView saveListView;
    private List<LiftSave> LiftSaves = new ArrayList<LiftSave>();
    private static final int EDIT = 0, DELETE = 1;

    LiftSave longClickedItemLiftSave;
    DatabaseHandler dbHandler;
    ArrayAdapter<LiftSave> saveAdapter;


    public FragmentS() {

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.listview_s,
                container, false);
        saveListView = (ListView) rootView.findViewById(R.id.saveListView);
        registerForContextMenu(saveListView);
        DatabaseHandler dbHandler;
        dbHandler = new DatabaseHandler (getActivity().getApplicationContext());
        if (dbHandler.getLiftSavesCount() != 0)
            LiftSaves.addAll(dbHandler.getAllLiftSaves());

        populateList();

        saveListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                longClickedItemLiftSave = (LiftSave) parent.getItemAtPosition(position);
                return false;
            }
        });

        return rootView;
    }

    private void populateList() {
        saveAdapter = new SaveListAdapter();
        saveListView.setAdapter(saveAdapter);
    }


    public class SaveListAdapter extends ArrayAdapter<LiftSave> {
            public SaveListAdapter() {
                super(getActivity(), R.layout.listview_item, LiftSaves);
            }

            @Override
            public View getView(int position, View view, ViewGroup parent) {
                if (view == null)
                    view = getActivity().getLayoutInflater().inflate(R.layout.listview_item, parent, false);

                LiftSave currentLiftSave = LiftSaves.get(position);

                TextView liftName = (TextView) view.findViewById(R.id.liftName);
                liftName.setText(currentLiftSave.getLiftName());
                TextView maxValue = (TextView) view.findViewById(R.id.maxValue);
                maxValue.setText(currentLiftSave.getMaxValue());
                TextView weightAndReps = (TextView) view.findViewById(R.id.weightAndReps);
                weightAndReps.setText(currentLiftSave.getRepsAndWeight());
                TextView liftNotes = (TextView) view.findViewById(R.id.liftNotes);
                liftNotes.setText(currentLiftSave.getLiftNotes());
                TextView date = (TextView) view.findViewById(R.id.todayDate);
                date.setText(currentLiftSave.getTodayDate());

                return view;
            }

    }
    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, view, menuInfo);

        menu.setHeaderIcon(R.drawable.pencil_icon);
        menu.setHeaderTitle("Save Options");
        menu.add(Menu.NONE, EDIT, menu.NONE, "Edit Save");
        menu.add(Menu.NONE, DELETE, menu.NONE, "Delete Save");
    }

    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case EDIT:
                FragmentManager manager = getFragmentManager();
                MyDialog myDialog = new MyDialog();

                //problem line
                myDialog.show(manager, "MyDialog");
                //problem line

                break;

            case DELETE:

                dbHandler = new DatabaseHandler(getActivity().getApplicationContext());
                dbHandler.deleteLiftSave(longClickedItemLiftSave);
                saveAdapter.remove(longClickedItemLiftSave);


                break;
        }
               return super.
               onContextItemSelected(item);
    }
}

【问题讨论】:

  • 确认您的对话框片段是从 android.support.v4.app.DialogFragment 扩展而来的。

标签: android listview android-fragments contextmenu fragmentmanager


【解决方案1】:

你有两种可能做你想做的事:

所以如果你的 MyDialog() 是 Fragment 你不能使用 .show() - 相反你应该改变你的片段:

    manager.beginTransaction().replace( R.id.container, myDialog).commit();

或者如果你的 MyDialog() 是一个 DialogFragment 你应该这样显示它:

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    MyDialog() myDialog = new MyDialog();

    myDialog.show( ft, "" ); 

【讨论】:

  • Aleizdein,感谢您的回复。它确实是一个DialogFragment,我称之为fragment 是按照您首先提到的方式设置的。我可能会遗漏一些东西,但我必须打电话给FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();,因为你提到的第二种方式(我相信正确的轨道)可以工作。将下一行的 MyDialog() 留下等待方法调用,并将 myDialog 作为无法解析的符号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多