NumberPicker 无法在 DialogFragment 内工作

Bur*_*077 5 android android-dialogfragment numberpicker dialogfragment

我正在学习 Android 编程的基础知识,但在使用 NumberPicker 时遇到了一些问题。

\n\n

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

\n\n

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

\n\n

以下是相关代码和图像的片段:

\n\n

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

\n\n
...\npublic class ClockActivity extends ActionBarActivity {\n\n...\n\n@Override\nprotected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n    setContentView(R.layout.activity_clock);\n\n    // Define gui objects\n    ...\n    mWorkForTime           = (Button)findViewById(R.id.work_for_time);\n    mBreakForTime          = (Button)findViewById(R.id.break_for_time);\n\n    // Add listeners for the work for/break for buttons\n    mWorkForTime.setOnClickListener(new View.OnClickListener() {\n        @Override\n        public void onClick(View v) {\n            // Bring up the picker fragment\n            DialogFragment newFragment = TimePickerFragment.newInstance(R.string.work_title);\n            newFragment.show(getSupportFragmentManager(), "WorkTimePicker");\n        }\n    });\n    mBreakForTime.setOnClickListener(new View.OnClickListener() {\n        @Override\n        public void onClick(View v) {\n            // Bring up the picker fragment\n            DialogFragment newFragment = TimePickerFragment.newInstance(R.string.break_title);\n            newFragment.show(getSupportFragmentManager(), "BreakTimePicker");\n        }\n    });\n    ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

TimePickerFragment 类扩展了 DialogFragment:

\n\n
public class TimePickerFragment extends DialogFragment {\n    // Setup the time pickers\n    private NumberPicker mHourPicker;\n    private NumberPicker mMinutePicker;\n\n    public static TimePickerFragment newInstance(int title) {\n        TimePickerFragment fragment = new TimePickerFragment();\n        Bundle args = new Bundle();\n        args.putInt("title", title);\n        fragment.setArguments(args);\n        return fragment;\n    }\n\n    @Override\n    public Dialog onCreateDialog(Bundle savedInstanceState) {\n        super.onCreateDialog(savedInstanceState);\n\n        int title = getArguments().getInt("title");\n\n        LayoutInflater inflater = getActivity().getLayoutInflater();\n\n        View view = (View)inflater.inflate(R.layout.activity_time_picker, null);\n\n        // Initialize the pickers\n        mHourPicker = (NumberPicker)view.findViewById(R.id.hours_picker);\n        mMinutePicker = (NumberPicker)view.findViewById(R.id.minutes_picker);\n        mHourPicker.setMinValue(0);\n        mMinutePicker.setMinValue(0);\n        mHourPicker.setMaxValue(24);\n        mMinutePicker.setMaxValue(59);\n\n\n        Dialog alertDialog = new AlertDialog.Builder(getActivity())\n                .setTitle(title)\n                .setView(inflater.inflate(R.layout.activity_time_picker, null))\n                .setNegativeButton(R.string.negate,\n                        new DialogInterface.OnClickListener() {\n                            @Override\n                            public void onClick(DialogInterface dialog, int which) {\n                                ((ClockActivity) getActivity()).doNegativeTimeDialogClick();\n                            }\n                        })\n                .setPositiveButton(R.string.confirm,\n                        new DialogInterface.OnClickListener() {\n                            @Override\n                            public void onClick(DialogInterface dialog, int which) {\n                                ((ClockActivity) getActivity()).doPositiveTimeDialogClick();\n                            }\n                        })\n                .create();\n        return alertDialog;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

以下是 DialogFragment 视图的 XML,位于

\n\n
<?xml version="1.0" encoding="utf-8"?>\n    <LinearLayout\n        xmlns:android="http://schemas.android.com/apk/res/android"\n        android:orientation="vertical"\n        android:layout_width="match_parent"\n        android:layout_height="match_parent">\n\n        <LinearLayout\n            android:layout_width="fill_parent"\n            android:layout_height="wrap_content">\n\n            <TextView\n                android:layout_width="0dp"\n                android:layout_weight="1"\n                android:layout_height="wrap_content"\n                android:gravity="center"\n                android:text="@string/hours"\n                android:textSize="24sp"\n                android:textStyle="bold"/>\n\n            <TextView\n                android:layout_width="0dp"\n                android:layout_weight="1"\n                android:layout_height="wrap_content"\n                android:gravity="center"\n                android:text="@string/minutes"\n                android:textSize="24sp"\n                android:textStyle="bold"/>\n\n        </LinearLayout>\n\n        <LinearLayout\n            android:layout_width="fill_parent"\n            android:layout_height="wrap_content">\n\n            <NumberPicker\n                android:id="@+id/hours_picker"\n                android:layout_width="0dp"\n                android:layout_weight="1"\n                android:layout_height="wrap_content"/>\n\n            <NumberPicker\n                android:id="@+id/minutes_picker"\n                android:layout_width="0dp"\n                android:layout_weight="1"\n                android:layout_height="wrap_content"/>\n\n        </LinearLayout>\n    </LinearLayout>\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是当前操作的图像:

\n\n

https://i.stack.imgur.com/FqSoA.png

\n\n

这是我想要的:

\n\n

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

\n\n

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

\n\n
01-02 16:10:46.559  18438-18438/com.example.android.worktimer W/IInputConnectionWrapper\xef\xb9\x95 beginBatchEdit on inactive InputConnection\n01-02 16:10:46.569  18438-18438/com.example.android.worktimer W/IInputConnectionWrapper\xef\xb9\x95 endBatchEdit on inactive InputConnection\n
Run Code Online (Sandbox Code Playgroud)\n

Far*_*hed 3

您必须向选择器提供您要选择的内容的数组。

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

和改变

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

    Dialog alertDialog = new AlertDialog.Builder(getActivity()).setTitle(title).setView(view)
Run Code Online (Sandbox Code Playgroud)

您再次夸大了视图。