我是android的新手,大约一个月前开始使用它,现在我正在尝试制作一个“购物清单”应用程序,以便练习。在这个应用程序中,我有一个ListView,用户可以通过ListView上方的EditText插入项目。当用户长按项目时,将出现带有“编辑”,“删除”和“标记”字段的ContextMenu。我已经使“删除”按钮工作,但我仍然有“编辑”功能的问题。为了使这个功能起作用,我创建了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();
}
正如您所看到的,我们在这里有一个正面按钮,它从MyActivity调用doPositiveClick方法,这似乎是主要的活动。
.setPositiveButton(R.string.save, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
((MyActivity)getActivity()).doPositiveClick();
}
所以,这是MyActivity类代码:
@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");
}
}
我的问题是我不知道如何创建Edit函数。我尝试使用AdapterContextMenuInfo,但它只适用于onContextItemSelected方法,因为它需要和Item一起使用。希望您能帮助我,并对可能缺乏信息表示抱歉,请向我提出任何其他问题。 附:我已经尝试将这个对话框用了差不多两个星期了,因此我真的很沮丧。
答案 0 :(得分:0)
我正在使用这种方法 - 它很简单,你可以根据自己的需要调整它:
首先创建一个处理结果的界面,例如:
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
}
...
}
修改强>:
您可以用任何视图替换EditText,包括布局
仍然可以使用相同的方案从DialogFragment后代返回结果 - 只需在构造函数或初始化方法中传递OnDialogResultListener。
我想说AlertDialog更轻巧,DialogFragment允许更多控制,你可以根据自己的需要使用它们。