NumberPicker在DialogFragment中不起作用

时间:2015-01-02 20:48:46

标签: android android-dialogfragment numberpicker dialogfragment

我正在学习Android编程的基础知识,并且在使用NumberPicker时遇到了一些麻烦。

我接近我想要的,对话框打开,小时和分钟号码选择器出现,但它们没有上下数字滚动。我也无法使用弹出的键盘编辑数字。我尝试添加一个onValueChange监听器,但是当我使用键盘时它没有生成任何事件。

有人可以提供有关如何解决此问题的建议吗?到目前为止,我已经注意到,我尝试对某些活动中的小部件或特定类中不支持的片段进行了很多操作。

以下是相关代码和图片的摘要:

我有一个带有两个按钮的ClockActivity类:

...
public class ClockActivity extends ActionBarActivity {

...

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_clock);

    // Define gui objects
    ...
    mWorkForTime           = (Button)findViewById(R.id.work_for_time);
    mBreakForTime          = (Button)findViewById(R.id.break_for_time);

    // Add listeners for the work for/break for buttons
    mWorkForTime.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Bring up the picker fragment
            DialogFragment newFragment = TimePickerFragment.newInstance(R.string.work_title);
            newFragment.show(getSupportFragmentManager(), "WorkTimePicker");
        }
    });
    mBreakForTime.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Bring up the picker fragment
            DialogFragment newFragment = TimePickerFragment.newInstance(R.string.break_title);
            newFragment.show(getSupportFragmentManager(), "BreakTimePicker");
        }
    });
    ...

TimePickerFragment类扩展了DialogFragment:

public class TimePickerFragment extends DialogFragment {
    // Setup the time pickers
    private NumberPicker mHourPicker;
    private NumberPicker mMinutePicker;

    public static TimePickerFragment newInstance(int title) {
        TimePickerFragment fragment = new TimePickerFragment();
        Bundle args = new Bundle();
        args.putInt("title", title);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        super.onCreateDialog(savedInstanceState);

        int title = getArguments().getInt("title");

        LayoutInflater inflater = getActivity().getLayoutInflater();

        View view = (View)inflater.inflate(R.layout.activity_time_picker, null);

        // Initialize the pickers
        mHourPicker = (NumberPicker)view.findViewById(R.id.hours_picker);
        mMinutePicker = (NumberPicker)view.findViewById(R.id.minutes_picker);
        mHourPicker.setMinValue(0);
        mMinutePicker.setMinValue(0);
        mHourPicker.setMaxValue(24);
        mMinutePicker.setMaxValue(59);


        Dialog alertDialog = new AlertDialog.Builder(getActivity())
                .setTitle(title)
                .setView(inflater.inflate(R.layout.activity_time_picker, null))
                .setNegativeButton(R.string.negate,
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                ((ClockActivity) getActivity()).doNegativeTimeDialogClick();
                            }
                        })
                .setPositiveButton(R.string.confirm,
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                ((ClockActivity) getActivity()).doPositiveTimeDialogClick();
                            }
                        })
                .create();
        return alertDialog;
    }
}

以下是

中DialogFragment视图的XML
<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content">

            <TextView
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="@string/hours"
                android:textSize="24sp"
                android:textStyle="bold"/>

            <TextView
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="@string/minutes"
                android:textSize="24sp"
                android:textStyle="bold"/>

        </LinearLayout>

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content">

            <NumberPicker
                android:id="@+id/hours_picker"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"/>

            <NumberPicker
                android:id="@+id/minutes_picker"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"/>

        </LinearLayout>
    </LinearLayout>

这是当前操作的图像:

http://i.imgur.com/4UiSLcn.png

以下是我希望拥有的内容:

http://www.i-programmer.info/images/stories/Core/Android/Pickers/ten.gif

当我尝试使用软键盘编辑NumberPicker时,我在控制台上看到的是一些输出:

01-02 16:10:46.559  18438-18438/com.example.android.worktimer W/IInputConnectionWrapper﹕ beginBatchEdit on inactive InputConnection
01-02 16:10:46.569  18438-18438/com.example.android.worktimer W/IInputConnectionWrapper﹕ endBatchEdit on inactive InputConnection

2 个答案:

答案 0 :(得分:3)

您必须为选择器提供您要选择的数组。

    String[] myStringArray = new String[]{"a","b","c"};
    mMinutePicker.setMinValue(0);
    mMinutePicker.setMaxValue(myStringArray.length - 1);
    mMinutePicker.setDisplayedValues(myStringArray);

并改变

    Dialog alertDialog = new AlertDialog.Builder(getActivity()) .setTitle(title) .setView(inflater.inflate(R.layout.activity_time_picker, null)) 

    Dialog alertDialog = new AlertDialog.Builder(getActivity()).setTitle(title).setView(view)

您正在再次膨胀视图。

答案 1 :(得分:0)

我在尝试使用 DialogFragment 使 NumberPicker 工作时遇到了同样的问题。上面提供的任何建议都不适合我。我要补充的是,这个问题并不是使用 NumberPicker 所独有的,因为我在使用 Spinner 时遇到了同样的问题。我的代码看起来很像 Burke9077,所以我就不重复了。

您会遇到许多问题,例如 findViewById 在 onCreateDialog 中不起作用。我认为这是因为视图尚未实例化。我尝试通过在 onCreateView 中初始化 NumberPicker 来解决这个问题。至少在这种方法中,我可以让 onFindViewById 工作,但它仍然无法为 NumberPicker 设置最小值和最大值。简而言之,我无法让 NumberPicker 在 DialogFragment 中工作。我正在尝试的一切,只是让代码更加模糊和难以理解。我的一个编码原则是在代码变得难以理解时停止使其工作。

我的解决方案是完全放弃使用 DialogFrament 的概念。相反,我选择即时构建对话框。这或多或少是这样的:

public Dialog show() {
    AppCompatActivity activity = CoreAndroid.getActivity();
    Context context = CoreAndroid.getContext();
    AlertDialog.Builder builder = new AlertDialog.Builder(activity);
    // Get the layout inflater
    LayoutInflater inflater = LayoutInflater.from(CoreAndroid.getContext());
    ViewGroup viewGroup = activity.findViewById(android.R.id.content);
    View dialogView = inflater.inflate(R.layout.log_filter_dialog, viewGroup, false);
    builder.setView(dialogView);
    builder.setPositiveButton(R.string.apply, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int id) {
            // sign in the user ...
        }
    })
            .setNegativeButton(R.string.exit, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    dialog.cancel();
                }
            });

    dialog = builder.create();
    initDialog(dialogView)  // this method is where the NumberPicker and other
                            // controls in the dialog get initialized
    dialog.show();
    return dialog;
}

它只是创建对话框并显示它的类中的一个方法。调用 builder.create 方法后,您可以使用 dialogView.findViewId 在对话框布局中找到要初始化的视图。与尝试使用 DialogFragment 相比,它更简单、更容易理解。我开始尝试使用 DialogFragment,因为其他人将其作为编码模板提供。使用 DialogFragment 可能是有原因的,但对于我需要做的事情,它太麻烦了,我无法让它做一些简单的事情,比如初始化控件。