NumberPicker 在 DialogFragment 中不起作用
NumberPicker not working inside DialogFragment
我正在学习 android 编程的基础知识,但在使用 NumberPicker 时遇到了一些问题。
我已经接近我想要的了,对话框打开了,小时和分钟数字选择器出现了,但是他们没有上面和下面的数字可以滚动。我也无法使用弹出的键盘编辑数字。我尝试添加一个 onValueChange 侦听器,但是当我使用键盘时它没有生成任何事件。
任何人都可以提供有关如何解决此问题的建议吗?到目前为止,我已经注意到,在特定的 class.
不支持的某些活动或片段中,我尝试使用小部件做很多事情
以下是相关代码和图片的片段:
我有一个带有两个按钮的 class 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 class 扩展了 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
您必须向选择器提供您要尝试的内容的数组select。
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)
您又在膨胀视图了。
我在尝试使用 DialogFragment 让 NumberPicker 工作时遇到了同样的问题。 None 上面提供的建议对我有用。我要补充一点,这个问题并不是使用 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;
}
它只是 class 中的一个方法,用于创建对话框并显示它。调用 builder.create 方法后,您可以在对话框布局中找到要使用 dialogView.findViewId 初始化的视图。它比尝试使用 DialogFragment 更简单、更容易理解。我迷上了尝试使用 DialogFragment,因为其他人将其作为编码模板提供。使用 DialogFragment 可能是有原因的,但对于我需要做的事情来说,它太麻烦了,我无法用它来做一些简单的事情,比如初始化控件。
我正在学习 android 编程的基础知识,但在使用 NumberPicker 时遇到了一些问题。
我已经接近我想要的了,对话框打开了,小时和分钟数字选择器出现了,但是他们没有上面和下面的数字可以滚动。我也无法使用弹出的键盘编辑数字。我尝试添加一个 onValueChange 侦听器,但是当我使用键盘时它没有生成任何事件。
任何人都可以提供有关如何解决此问题的建议吗?到目前为止,我已经注意到,在特定的 class.
不支持的某些活动或片段中,我尝试使用小部件做很多事情以下是相关代码和图片的片段:
我有一个带有两个按钮的 class 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 class 扩展了 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
您必须向选择器提供您要尝试的内容的数组select。
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)
您又在膨胀视图了。
我在尝试使用 DialogFragment 让 NumberPicker 工作时遇到了同样的问题。 None 上面提供的建议对我有用。我要补充一点,这个问题并不是使用 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;
}
它只是 class 中的一个方法,用于创建对话框并显示它。调用 builder.create 方法后,您可以在对话框布局中找到要使用 dialogView.findViewId 初始化的视图。它比尝试使用 DialogFragment 更简单、更容易理解。我迷上了尝试使用 DialogFragment,因为其他人将其作为编码模板提供。使用 DialogFragment 可能是有原因的,但对于我需要做的事情来说,它太麻烦了,我无法用它来做一些简单的事情,比如初始化控件。