如何创建数字选择器对话框?

Posted

技术标签:

【中文标题】如何创建数字选择器对话框?【英文标题】:How to create a number picker dialog? 【发布时间】:2013-07-22 05:15:12 【问题描述】:

我希望能够创建一个对话框,允许用户从指定范围内选择一个数字。

我知道现有的小部件(例如来自 quietcoding 和 SimonVT 的小部件)已经做到了这一点,但我很难将它们正确地集成到我的应用程序中。此外,这些主要是小部件。我想要一些与 android 开发者页面教程中的非常相似的东西。

我还检查了 NumberPicker 的文档,它说要检查 TimePicker 和 DatePicker 以获取示例,但它们只显示如何使用时间和日期选择器,我很难摸索代码并尝试将时间选择器转换为普通的数字选择器。有谁知道从哪里开始?在过去的 3 个小时里,我一直在寻找解决方案,但无济于事。

【问题讨论】:

如果不需要自定义视图,使用AlertDialog.BuildersetView()方法更简单。 Here 是示例代码。 【参考方案1】:

我做了一个 NumberPicker 的小演示。这可能并不完美,但您可以使用和修改它。

public class MainActivity extends Activity implements NumberPicker.OnValueChangeListener

    private static 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);
         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);
         np.setMinValue(0);
         np.setWrapSelectorWheel(false);
         np.setOnValueChangedListener(this);
         b1.setOnClickListener(new OnClickListener()
         
          @Override
          public void onClick(View v) 
              tv.setText(String.valueOf(np.getValue()));
              d.dismiss();
               
          );
         b2.setOnClickListener(new OnClickListener()
         
          @Override
          public void onClick(View v) 
              d.dismiss();
               
          );
       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_
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    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>

编辑:

在 res/values/dimens.xml 下

<resources>

    <!-- Default screen margins, per the Android Design guidelines. -->
    <dimen name="activity_horizontal_margin">16dp</dimen>
    <dimen name="activity_vertical_margin">16dp</dimen>

</resources>

【讨论】:

它有效。但是,我有一个问题,如果我需要让用户选择 2 个号码怎么办?我可以将第二个值分配给不同的 textView/变量吗? 您可以使用单个选择器并使用布尔值 true 或 false 将值设置为另一个文本视图。不需要两个拣货员。很高兴以上有帮助。 此外,选择器 xml 中的填充代码似乎不起作用。它给出了错误No resource found that matches the given name (at 'paddingBottom' with value @dimen/activity_vertical_margin) @Razgriz 这些值应该是 dimens.xml 。你可以创建你自己的。删除这些并添加您自己的。我无法发布整个项目。 NumberPicker 最少 11 个 api。较低的 api 级别呢?【参考方案2】:

一个简单的例子:

布局/billing_day_dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_ >

    <NumberPicker
        android:id="@+id/number_picker"
        android:layout_
        android:layout_
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true" />

    <Button
        android:id="@+id/apply_button"
        android:layout_
        android:layout_
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/number_picker"
        android:text="Apply" />

</RelativeLayout>

NumberPickerActivity.java

import android.app.Activity;

import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.NumberPicker;

public class NumberPickerActivity extends Activity 


  @Override
  protected void onCreate(Bundle savedInstanceState) 
  

    super.onCreate(savedInstanceState);
    setContentView(R.layout.billing_day_dialog);
    NumberPicker np = (NumberPicker)findViewById(R.id.number_picker);
    np.setMinValue(1);// restricted number to minimum value i.e 1
    np.setMaxValue(31);// restricked number to maximum value i.e. 31
    np.setWrapSelectorWheel(true); 

    np.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() 
    

      @Override
      public void onValueChange(NumberPicker picker, int oldVal, int newVal) 
      

       // TODO Auto-generated method stub

       String Old = "Old Value : ";

       String New = "New Value : ";

      
    );

     Log.d("NumberPicker", "NumberPicker");

   

/* NumberPickerActivity */

AndroidManifest.xml : 指定activity的主题为对话主题。

<activity
  android:name="org.npn.analytics.call.NumberPickerActivity"
  android:theme="@android:style/Theme.Holo.Dialog"
  android:label="@string/title_activity_number_picker" >
</activity>

希望它会有所帮助。

【讨论】:

【参考方案3】:

考虑在对话框中使用Spinner 而不是数字选择器。这并不完全符合我们的要求,但它更容易实现、更具上下文的 UI 设计,并且应该满足大多数用例。 Spinner 的等效代码是:

Spinner picker = new Spinner(this);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item, yourStringList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
picker.setAdapter(adapter);

【讨论】:

试图在 Preferences xml 文件中使用它会导致通胀崩溃【参考方案4】:

要在AlertDialog 中显示NumberPicker,请使用以下代码:

final AlertDialog.Builder d = new AlertDialog.Builder(context);
LayoutInflater inflater = this.getLayoutInflater();
View dialogView = inflater.inflate(R.layout.number_picker_dialog, null);
d.setTitle("Title");
d.setMessage("Message");
d.setView(dialogView);
final NumberPicker numberPicker = (NumberPicker) dialogView.findViewById(R.id.dialog_number_picker);
numberPicker.setMaxValue(50);
numberPicker.setMinValue(1);
numberPicker.setWrapSelectorWheel(false);
numberPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() 
    @Override
    public void onValueChange(NumberPicker numberPicker, int i, int i1) 
        Log.d(TAG, "onValueChange: ");
    
);
d.setPositiveButton("Done", new DialogInterface.OnClickListener() 
    @Override
    public void onClick(DialogInterface dialogInterface, int i) 
        Log.d(TAG, "onClick: " + numberPicker.getValue());
    
);
d.setNegativeButton("Cancel", new DialogInterface.OnClickListener() 
    @Override
    public void onClick(DialogInterface dialogInterface, int i) 
    
);
AlertDialog alertDialog = d.create();
alertDialog.show();

number_picker_dialog.xml

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:layout_gravity="center"
android:gravity="center_horizontal">

<NumberPicker
    android:id="@+id/dialog_number_picker"
    android:layout_
    android:layout_/>
</LinearLayout>

【讨论】:

LinearLayout 在这里是多余的,不是吗?【参考方案5】:

对于 kotlin 爱好者。

fun numberPickerCustom() 
    val d = AlertDialog.Builder(context)
    val inflater = this.layoutInflater
    val dialogView = inflater.inflate(R.layout.number_picker_dialog, null)
    d.setTitle("Title")
    d.setMessage("Message")
    d.setView(dialogView)
    val numberPicker = dialogView.findViewById<NumberPicker>(R.id.dialog_number_picker)
    numberPicker.maxValue = 15
    numberPicker.minValue = 1
    numberPicker.wrapSelectorWheel = false
    numberPicker.setOnValueChangedListener  numberPicker, i, i1 -> println("onValueChange: ") 
    d.setPositiveButton("Done")  dialogInterface, i ->
        println("onClick: " + numberPicker.value)       
        
    d.setNegativeButton("Cancel")  dialogInterface, i -> 
    val alertDialog = d.create()
    alertDialog.show()

number_picker_dialog.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:layout_gravity="center"
    android:gravity="center_horizontal">

    <NumberPicker
        android:id="@+id/dialog_number_picker"
        android:layout_
        android:layout_/>
</LinearLayout>

【讨论】:

如何控制,选择轮中一次显示的项目数? @KPradeepKumarReddy 你的意思是最小和最大范围?在代码中,“numberPicker.maxValue=15”根据你的需要改变值。同样适用于 minValue

以上是关于如何创建数字选择器对话框?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建类似于默认窗口框的文件选择器?

如何创建新的“圆形”日期选择器 android 对话框

带有数字选择器的 Android PreferenceActivity 对话框

您如何根据偏好创建开始时间和结束时间选择器?

无法创建日期选择器对话框

如何从地点选择器活动中检索地图快照?