我需要构建一个DialogFragment,它将用户输入从对话框返回到活动。该对话框需要在OnClickListener中调用,当单击列表视图中的元素时会调用该对话框。 DialogFragment的返回值(用户的输入)应在活动的OnClickListener中直接可用。
我尝试通过遵循官方文档来实现此目的:http : //developer.android.com/guide/topics/ui/dialogs.html#PassingEvents
我需要像下面这样的东西,因为我不知道如何使匿名OnClickListener实现CustomNumberPicker类的接口,所以它不起作用。 据我所知,实现接口是必要的,以便将DialogFragment中的数据返回给Activity。
主要活动:
public class MainAcitivity extends ActionBarActivity { [...] // ArrayAdapter of the Listview private class ListViewArrayAdapter extends ArrayAdapter<Exercise> { public ListViewArrayAdapter(Context context, ArrayList<Exercise> exercises) { super(context, 0, exercises); } @Override public View getView(int position, View convertView, ViewGroup parent) { [...] if (convertView == null) { convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_workoutdetail, parent, false); } TextView tvSets = (TextView) convertView.findViewById(R.id.tvWorkoutExerciseSets); tvSets.setText(sets.toString()); // OnClickListener for every element in the ListView tvSets.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // This is where the Dialog should be called and // the user input from the Dialog should be returned DialogFragment numberpicker = new CustomNumberPicker(); numberpicker.show(MainActivity.this.getSupportFragmentManager(), "NoticeDialogFragment"); } // Here I would like to implement the interface of CustomNumberPicker // in order to get the user input entered in the Dialog }); return convertView; } } }
CustomNumberPicker(与文档基本相同):
public class CustomNumberPicker extends DialogFragment { public interface NoticeDialogListener { public void onDialogPositiveClick(DialogFragment dialog); public void onDialogNegativeClick(DialogFragment dialog); } // Use this instance of the interface to deliver action events NoticeDialogListener mListener; // Override the Fragment.onAttach() method to instantiate the NoticeDialogListener @Override public void onAttach(Activity activity) { super.onAttach(activity); // Verify that the host activity implements the callback interface try { // Instantiate the NoticeDialogListener so we can send events to the host mListener = (NoticeDialogListener) activity; } catch (ClassCastException e) { // The activity doesn't implement the interface, throw exception throw new ClassCastException(activity.toString() + " must implement NoticeDialogListener"); } } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // Use the Builder class for convenient dialog construction AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setMessage("Sets") .setPositiveButton("set", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // Return stuff here to the activity? } }) .setNegativeButton("cancle", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // User cancelled the dialog } }); // Create the AlertDialog object and return it return builder.create(); } }
像这样吗
public class CustomNumberPicker extends DialogFragment { private NoticeDialogListener ndl; public interface NoticeDialogListener { public void onDialogPositiveClick(DialogFragment dialog); public void onDialogNegativeClick(DialogFragment dialog); } //add a custom constructor so that you have an initialised NoticeDialogListener public CustomNumberPicker(NoticeDialogListener ndl){ super(); this.ndl=ndl; } //make sure you maintain an empty constructor public CustomNumberPicker( ){ super(); } // Use this instance of the interface to deliver action events NoticeDialogListener mListener; // Override the Fragment.onAttach() method to instantiate the NoticeDialogListener @Override public void onAttach(Activity activity) { super.onAttach(activity); //remove the check that verfis if your activity has the DialogListener Attached because you want to attach it into your list view onClick() } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // Use the Builder class for convenient dialog construction AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setMessage("Sets") .setPositiveButton("set", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { ndl.onDialogPositiveClick(dialog); } }) .setNegativeButton("cancle", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { ndl.onDialogNegativeClick(dialog); } }); // Create the AlertDialog object and return it return builder.create(); } }
然后您的listView onClick变为:
tvSets.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // This is where the Dialog should be called and // the user input from the Dialog should be returned // // DialogFragment numberpicker = new CustomNumberPicker(new NoticeDialogListener() { @Override public void onDialogPositiveClick(DialogFragment dialog) { //What you want to do incase of positive click } @Override public void onDialogNegativeClick(DialogFragment dialog) { //What you want to do incase of negative click } };); numberpicker.show(MainActivity.this.getSupportFragmentManager(), "NoticeDialogFragment"); } // Here I would like to implement the interface of CustomNumberPicker // in order to get the user input entered in the Dialog });
请阅读我添加的注释。由于您确实不需要整个对话框实例来获取所需的值,因此甚至可以对其进行进一步优化。
编辑 可能的优化可能是:
将侦听器界面更改为:
public interface NoticeDialogListener { public void onDialogPositiveClick(String output); public void onDialogNegativeClick(String output); //or whatever form of output that you want }
然后相应地修改已实现的方法。