Java 使用EditText创建DialogFragment

Java 使用EditText创建DialogFragment,java,android,Java,Android,我是android新手,大约一个月前开始使用,现在为了练习,我正在尝试制作一个“购物清单”应用程序。在这个应用程序中,我有一个列表视图,用户可以通过该列表视图上方的EditText插入项目。当用户长按项目时,显示带有“编辑”、“删除”和“标记”字段的上下文菜单。我已经使“删除”按钮工作,但我仍然有“编辑”功能的问题。为了使这个函数工作,我创建了DialogFragment类,所以当用户按下“编辑”按钮时,这个DialogFragment就会出现。此DF有EditText字段,在其中输入要更改的数

我是android新手,大约一个月前开始使用,现在为了练习,我正在尝试制作一个“购物清单”应用程序。在这个应用程序中,我有一个列表视图,用户可以通过该列表视图上方的EditText插入项目。当用户长按项目时,显示带有“编辑”、“删除”和“标记”字段的上下文菜单。我已经使“删除”按钮工作,但我仍然有“编辑”功能的问题。为了使这个函数工作,我创建了DialogFragment类,所以当用户按下“编辑”按钮时,这个DialogFragment就会出现。此DF有EditText字段,在其中输入要更改的数据。下面是DialogFragment类代码:

public class AlertEdit extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
       AlertDialog.Builder bd = new AlertDialog.Builder(getActivity());
       LayoutInflater inflater = getActivity().getLayoutInflater();
       bd.setView(inflater.inflate(R.layout.alert, null))
               .setTitle("Edit")
               .setPositiveButton(R.string.save, new DialogInterface.OnClickListener() {
                   @Override
                   public void onClick(DialogInterface dialog, int which) {
                       ((MyActivity)getActivity()).doPositiveClick();
                   }
               })
                .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        ((MyActivity)getActivity()).doNegativeClick();
                    }
                });

        return bd.create();
    }
   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

         lw = (ListView) findViewById(R.id.listView);
         edtxt = (EditText) findViewById(R.id.editText);
        alertEd = (EditText) findViewById(R.id.alertEdit);


        goods = new ArrayList<String>();

        adapter  = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, goods);
        lw.setAdapter(adapter);

        lw.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> adapter, View v,
                                    int position, long id) {

            }
        });
        registerForContextMenu(lw);

        edtxt.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {

                if (event.getAction()== KeyEvent.ACTION_DOWN) {
                    if (keyCode == KeyEvent.KEYCODE_ENTER) {
                        goods.add(0, edtxt.getText().toString());
                        adapter.notifyDataSetChanged();
                        edtxt.setText("");
                        return true;
                    }
                }
               return false;
            }
        });
        }

    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo info){
        super.onCreateContextMenu(menu, v, info);
        getMenuInflater().inflate(R.menu.actions, menu);

    }
    public boolean onContextItemSelected(MenuItem item) {

        position = (int) info.id;
        switch (item.getItemId()) {
            case R.id.cnt_mnu_delete:
                goods.remove(position);
                adapter.notifyDataSetChanged();
                return true;
            case R.id.cnt_mnu_edit:   
    }


        return super.onContextItemSelected(item);
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.my, menu);
        return true;
    }

    @Override
public boolean onOptionsItemSelected(MenuItem item) {

int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public void doPositiveClick()
{    
}
public void doNegativeClick()
{ 
}
public void showDialog()
{
    DialogFragment frag = new AlertEdit();
    frag.show(getFragmentManager(), "edit");
}
}
如您所见,这里有一个肯定按钮,它从MyActivity调用doPositiveClick方法,MyActivity似乎是主要的活动

.setPositiveButton(R.string.save, new DialogInterface.OnClickListener() {
               @Override
               public void onClick(DialogInterface dialog, int which) {
                   ((MyActivity)getActivity()).doPositiveClick();
               }
下面是MyActivity类代码:

public class AlertEdit extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
       AlertDialog.Builder bd = new AlertDialog.Builder(getActivity());
       LayoutInflater inflater = getActivity().getLayoutInflater();
       bd.setView(inflater.inflate(R.layout.alert, null))
               .setTitle("Edit")
               .setPositiveButton(R.string.save, new DialogInterface.OnClickListener() {
                   @Override
                   public void onClick(DialogInterface dialog, int which) {
                       ((MyActivity)getActivity()).doPositiveClick();
                   }
               })
                .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        ((MyActivity)getActivity()).doNegativeClick();
                    }
                });

        return bd.create();
    }
   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

         lw = (ListView) findViewById(R.id.listView);
         edtxt = (EditText) findViewById(R.id.editText);
        alertEd = (EditText) findViewById(R.id.alertEdit);


        goods = new ArrayList<String>();

        adapter  = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, goods);
        lw.setAdapter(adapter);

        lw.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> adapter, View v,
                                    int position, long id) {

            }
        });
        registerForContextMenu(lw);

        edtxt.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {

                if (event.getAction()== KeyEvent.ACTION_DOWN) {
                    if (keyCode == KeyEvent.KEYCODE_ENTER) {
                        goods.add(0, edtxt.getText().toString());
                        adapter.notifyDataSetChanged();
                        edtxt.setText("");
                        return true;
                    }
                }
               return false;
            }
        });
        }

    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo info){
        super.onCreateContextMenu(menu, v, info);
        getMenuInflater().inflate(R.menu.actions, menu);

    }
    public boolean onContextItemSelected(MenuItem item) {

        position = (int) info.id;
        switch (item.getItemId()) {
            case R.id.cnt_mnu_delete:
                goods.remove(position);
                adapter.notifyDataSetChanged();
                return true;
            case R.id.cnt_mnu_edit:   
    }


        return super.onContextItemSelected(item);
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.my, menu);
        return true;
    }

    @Override
public boolean onOptionsItemSelected(MenuItem item) {

int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public void doPositiveClick()
{    
}
public void doNegativeClick()
{ 
}
public void showDialog()
{
    DialogFragment frag = new AlertEdit();
    frag.show(getFragmentManager(), "edit");
}
}
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
lw=(ListView)findViewById(R.id.ListView);
edtxt=(EditText)findViewById(R.id.EditText);
alertEd=(EditText)findViewById(R.id.alertEdit);
货物=新阵列列表();
adapter=new ArrayAdapter(这是android.R.layout.simple\u list\u item\u 1,商品);
设置适配器(适配器);
setOnItemClickListener(新的OnItemClickListener(){
公共单击(适配器视图适配器,视图v,
内部位置,长id){
}
});
registerForContextMenu(lw);
setOnKeyListener(新视图.OnKeyListener(){
@凌驾
公共布尔onKey(视图v、int keyCode、KeyEvent事件){
if(event.getAction()==KeyEvent.ACTION\u向下){
if(keyCode==KeyEvent.keyCode\u输入){
添加(0,edText.getText().toString());
adapter.notifyDataSetChanged();
edText.setText(“”);
返回true;
}
}
返回false;
}
});
}
public void onCreateContextMenu(ContextMenu菜单,视图v,ContextMenu.ContextMenuInfo信息){
super.onCreateContextMenu(menu,v,info);
getMenuInflater().充气(R.menu.actions,menu);
}
公共布尔值onContextItemSelected(MenuItem项){
位置=(int)info.id;
开关(item.getItemId()){
案例R.id.cnt\u mnu\u删除:
货物。移除(位置);
adapter.notifyDataSetChanged();
返回true;
案例R.id.cnt\u mnu\u编辑:
}
返回super.onContextItemSelected(项目);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(R.menu.my,menu);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
int id=item.getItemId();
if(id==R.id.action\u设置){
返回true;
}
返回super.onOptionsItemSelected(项目);
}
public void doPositiveClick()
{    
}
public void doNegativeClick()
{ 
}
公共对话框()
{
DialogFragment frag=新建AlertEdit();
显示(getFragmentManager(),“编辑”);
}
}
我的问题是我不知道如何创建编辑功能。我尝试使用AdapterContextMenuInfo,但它仅在onContextItemSelected方法中有效,因为它需要和项才能使用。希望您能帮助我,并为可能缺少的信息感到抱歉,请问我任何其他问题。
另外,我已经尝试了将近两周的对话,我真的很沮丧。

我正在使用这种方法-它很简单,您可以根据您的需要调整它:

首先,制作一个界面来处理结果,例如:

public interface OnDialogResultListener {
    public void onDialogResult(String result);
}
然后将对话框与其他视图一起使用,如下所示:

public void showDialogAndGetResult(final int title, final String message, final String initialText, final OnDialogResultListener listener) {
// additional View - use appropriate View to your needs:
final EditText editText = new EditText(this);
editText.setText(initialText);

new AlertDialog.Builder(MainActivity.this)//
    .setTitle(title)//
    .setMessage(message)//
    .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            if (listener != null) {
                listener.onDialogResult(editText.getText().toString());
            }
        }
    })//
    .setNegativeButton(android.R.string.cancel, null)//
    .setView(editText)//
    .show();
}
最后,在您的活动中实现此接口:

public class YourActivity Extends Activity implements OnDialogResultListener{
...
    @Override
    public void onDialogResult(String result) {
        //do what you need
    }
...
}
编辑: 您可以用任何视图(包括布局)替换编辑文本。

仍然可以使用相同的方案从DialogFragment子体返回结果-只需在构造函数或初始化方法中传递OnDialogResultListener
我想说,AlertDialog更加轻量级,DialogFragment允许更多的控制,您可以根据需要使用这两种功能。

您的按钮工作正常吗?我的意思是你能看到编辑点击事件是否有响应吗?如果是,您的用户可以编辑哪些字段。如果你想分享你的代码,请发邮件给mahesh。venkat27@gmail.com,我会尽力帮你的。这听起来很棘手也很有趣。非常感谢您的回复!我现在的问题是:为什么我必须使用editText作为视图?我不能使用自定义布局吗?我已经根据您的附加问题编辑了文章,请看一看