带编号选择器的警报对话框 - 不实现监听器

时间:2013-07-03 17:50:14

标签: android dialog numbers alert picker

我是Android开发的新手。我想从主活动中打开数字选择器的警报对话框,然后从警报对话框中获取输入并在主视图中显示它。

我编写的代码来自一些引用并且它的工作正确。但我不想在主要活动中使用“implements NumberPickerFragment.NoticeDialogListener”。请帮帮我,我怎样才能将价值归还给主要活动。

我的主要活动代码是:

    package com.pinnacleappdesign.pinnacleappdesign;

import android.os.Bundle;
import android.app.Activity;
import android.app.DialogFragment;
import android.view.Menu;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity implements NumberPickerFragment.NoticeDialogListener{

    int memoryIndex = 5;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

        Button firstPaneButton = (Button)findViewById(R.id.first_pane_button1);

        firstPaneButton.setOnClickListener(new OnClickListener() {

            public void onClick(View v){
               DialogFragment newFragment = new NumberPickerFragment();

                Bundle args = new Bundle();

                args.putInt("currentMemoryIndex", memoryIndex);
                newFragment.setArguments(args);
                newFragment.show(getFragmentManager(), "numberPicker");
            }       

        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }


   public void onDialogPositiveClick(int newMemoryIndex) {
    this.memoryIndex = newMemoryIndex;

    /** Getting the reference of the textview from the main layout */
    TextView tv = (TextView) findViewById(R.id.tv_android);

    /** Setting the selected android version in the textview */
    tv.setText("Your Choice : " + this.memoryIndex);        
   }

}

我的NumberPickerFragment.java代码是:

 package com.pinnacleappdesign.pinnacleappdesign;

    import android.app.Activity;
    import android.app.AlertDialog;
    import android.app.Dialog;
    import android.app.DialogFragment;
    import android.content.DialogInterface;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.widget.NumberPicker;
    import android.widget.Toast;

public class NumberPickerFragment extends DialogFragment{

       /* The activity that creates an instance of this dialog fragment must
     * implement this interface in order to receive event callbacks.
     * Each method passes the DialogFragment in case the host needs to query it. */
    public interface NoticeDialogListener {
        public void onDialogPositiveClick(int newMemoryIndex);
    }

    // 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");
        }
    }

    public Dialog onCreateDialog(Bundle savedInstanceState) {

        Bundle bundle = getArguments();
        int currentMemoryIndex = bundle.getInt("currentMemoryIndex");

        // Use the Builder class for convenient dialog construction
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

       // Get the layout inflater
        LayoutInflater inflater = getActivity().getLayoutInflater();

        // Inflate and set the layout for the dialog
        // Pass null as the parent view because its going in the dialog layout

        View DialogView = inflater.inflate(R.layout.number_picker, null);

        final NumberPicker np = (NumberPicker)DialogView.findViewById(R.id.numberPicker1);

        np.setMinValue(1);
        np.setMaxValue(100);
        np.setWrapSelectorWheel(false);
        np.setValue(currentMemoryIndex);

        builder.setTitle(R.string.dialog_title)
               .setView(DialogView)
               .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                    // User confirmed the dialog
                    int position = np.getValue();           
                    mListener.onDialogPositiveClick(position);  
                   }
               })
               .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       // User cancelled the dialog
                   }
               });
        // Create the AlertDialog object and return it
          return builder.create();
    }

}

1 个答案:

答案 0 :(得分:0)

您当前的方法有什么问题?这似乎是Android鼓励开发人员使用的方法,如下所示:Communicating with Fragments

您也可以在NumberPickerFragment

中执行此类操作
((MainActivity) getActivity()).yourMethod();

但IMO使用定义的接口方法更加清晰和可重复使用。