如何在对话框中使用数字选择器
Posted
技术标签:
【中文标题】如何在对话框中使用数字选择器【英文标题】:how to use number picker with dialog 【发布时间】:2013-07-30 10:11:59 【问题描述】:我想使用数字选择器从用户那里获得折扣百分比。一旦用户输入销售价格,我希望出现一个对话框,询问折扣百分比。我找不到将数字选择器集成到对话框中的方法。
【问题讨论】:
Google Alert Dialog 看到这个answer 【参考方案1】:我做了一个 NumberPicker 的小演示。这可能并不完美,但您可以使用和修改它。
使用自定义对话框并设置数字选择器。
更多信息@
http://developer.android.com/reference/android/widget/NumberPicker.html
public class MainActivity extends Activity implements NumberPicker.OnValueChangeListener
private TextView tv;
static Dialog d ;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.textView1);
Button b = (Button) findViewById(R.id.button11);// on click of button display the dialog
b.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
show();
);
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal)
Log.i("value is",""+newVal);
public void show()
final Dialog d = new Dialog(MainActivity.this);
d.setTitle("NumberPicker");
d.setContentView(R.layout.dialog);
Button b1 = (Button) d.findViewById(R.id.button1);
Button b2 = (Button) d.findViewById(R.id.button2);
final NumberPicker np = (NumberPicker) d.findViewById(R.id.numberPicker1);
np.setMaxValue(100); // max value 100
np.setMinValue(0); // min value 0
np.setWrapSelectorWheel(false);
np.setOnValueChangedListener(this);
b1.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
tv.setText(String.valueOf(np.getValue())); //set the value to textview
d.dismiss();
);
b2.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
d.dismiss(); // dismiss the dialog
);
d.show();
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
tools:context=".MainActivity" >
<TextView
android:id="@+id/textView1"
android:layout_
android:layout_
android:text="@string/hello_world" />
<Button
android:id="@+id/button11"
android:layout_
android:layout_
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:text="Open" />
</RelativeLayout>
dialog.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_ >
<NumberPicker
android:id="@+id/numberPicker1"
android:layout_
android:layout_
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="64dp" />
<Button
android:id="@+id/button2"
android:layout_
android:layout_
android:layout_below="@+id/numberPicker1"
android:layout_marginLeft="20dp"
android:layout_marginTop="98dp"
android:layout_toRightOf="@+id/numberPicker1"
android:text="Cancel" />
<Button
android:id="@+id/button1"
android:layout_
android:layout_
android:layout_alignBaseline="@+id/button2"
android:layout_alignBottom="@+id/button2"
android:layout_marginRight="16dp"
android:layout_toLeftOf="@+id/numberPicker1"
android:text="Set" />
</RelativeLayout>
快照
【讨论】:
我有一个带虚线的背景图像,现在我希望用户在虚线上绘制,我必须验证它是否正确?是否可以在画布中进行,我该如何进行? @Raghunandan:有没有办法在点击中心值时关闭选择器。我的意思是,如果我单击选定的值,就会看到 3 个值,numberPicker 会消失吗?不使用确定/取消按钮。我尝试了 NumberPicker 的 onClick 方法,但没有输出。 :( 如何隐藏其他数字(下一个和上一个)只显示当前一个 @Arjun 创建自定义视图 @raghunandan 你能提供一些操作吗?对不起,我是初学者,我创建了一个自定义视图,但它完全不同,谢谢......【参考方案2】:请尝试以下代码:
RelativeLayout linearLayout = new RelativeLayout(mContext);
final NumberPicker aNumberPicker = new NumberPicker(mContext);
aNumberPicker.setMaxValue(50);
aNumberPicker.setMinValue(1);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(50, 50);
RelativeLayout.LayoutParams numPicerParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
numPicerParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
linearLayout.setLayoutParams(params);
linearLayout.addView(aNumberPicker,numPicerParams);
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(mContext);
alertDialogBuilder.setTitle("Select the number");
alertDialogBuilder.setView(linearLayout);
alertDialogBuilder
.setCancelable(false)
.setPositiveButton("Ok",
new DialogInterface.OnClickListener()
public void onClick(DialogInterface dialog,
int id)
Log.e("","New Quantity Value : "+ aNumberPicker.getValue());
)
.setNegativeButton("Cancel",
new DialogInterface.OnClickListener()
public void onClick(DialogInterface dialog,
int id)
dialog.cancel();
);
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
【讨论】:
这段代码对我来说也运行良好。我想再添加一个数字选择器。我能够实现它但无法格式化它。你能指导我只使用 java 将两个数字选择器设置为相等的宽度吗? 不错!非常感谢。这使用了 Android 平台按钮,所以这是一个选择。为我节省了很多时间。 我之所以选择这个答案,是因为仅仅为了一个对话框而摆弄 xml 布局似乎太费劲了。当我实现它时,这个实际上看起来也更好。 对我不起作用 -android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
要修复它,我必须将 alertDialogBuilder 实例化更改为 AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
【参考方案3】:
这是其他答案的较短变体
NumberPicker picker = new NumberPicker(context);
picker.setMinValue(1);
picker.setMaxValue(50);
FrameLayout layout = new FrameLayout(context);
layout.addView(picker, new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.WRAP_CONTENT,
FrameLayout.LayoutParams.WRAP_CONTENT,
Gravity.CENTER));
new AlertDialog.Builder(context)
.setView(layout)
.setPositiveButton(android.R.string.ok, (dialogInterface, i) ->
// do something with picker.getValue()
picker.getValue();
)
.setNegativeButton(android.R.string.cancel, null)
.show();
【讨论】:
它有效。我正在使用 EditText,将 focusable 设置为 false 并将 OnClickListener 设置为使视图“单次”可点击。谢谢!【参考方案4】:创建一个 DialogFragment 实现 onCreateDialog 方法,该方法返回包含 NumberPicker 视图的警报对话框。 在需要显示数字选择器对话框的活动中实例化对话框片段并显示它。
使宿主Activity实现NumberPicker.OnValueChangeListener接口,以便对话框中的正负按钮点击事件处理程序可以通过调用接口onValueChange方法从NumberPicker传递当前值。
更多信息可以查看http://www.zoftino.com/android-numberpicker-dialog-example。
public class NumberPickerDialog extends DialogFragment
private NumberPicker.OnValueChangeListener valueChangeListener;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
final NumberPicker numberPicker = new NumberPicker(getActivity());
numberPicker.setMinValue(20);
numberPicker.setMaxValue(60);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Choose Value");
builder.setMessage("Choose a number :");
builder.setPositiveButton("OK", new DialogInterface.OnClickListener()
@Override
public void onClick(DialogInterface dialog, int which)
valueChangeListener.onValueChange(numberPicker,
numberPicker.getValue(), numberPicker.getValue());
);
builder.setNegativeButton("CANCEL", new DialogInterface.OnClickListener()
@Override
public void onClick(DialogInterface dialog, int which)
valueChangeListener.onValueChange(numberPicker,
numberPicker.getValue(), numberPicker.getValue());
);
builder.setView(numberPicker);
return builder.create();
public NumberPicker.OnValueChangeListener getValueChangeListener()
return valueChangeListener;
public void setValueChangeListener(NumberPicker.OnValueChangeListener valueChangeListener)
this.valueChangeListener = valueChangeListener;
【讨论】:
以上是关于如何在对话框中使用数字选择器的主要内容,如果未能解决你的问题,请参考以下文章