Quiero poder crear un diálogo que le permita al usuario elegir un número de un rango específico.
Sé que hay widgets existentes (como los de quietlycoding y el de SimonVT) que ya hacen esto, pero me cuesta integrarlos correctamente en mi aplicación. Además, esos son principalmente widgets. Quiero algo que sea muy similar al de los tutoriales de la página de desarrolladores de Android.
También verifiqué la documentación de NumberPicker y me dijo que revisara TimePicker y DatePicker para ver ejemplos, pero solo muestran cómo usar los selectores de fecha y hora y estoy teniendo dificultades para encontrar mi camino en el código y tratar de convertir el Selector de tiempo a un selector de números normal. ¿Alguien tiene alguna idea de por dónde empezar? He estado buscando soluciones durante las últimas 3 horas sin éxito.
setView()
método deAlertDialog.Builder
es más fácil y sencillo. Aquí está el código de muestra.Respuestas:
Hice una pequeña demostración de NumberPicker. Puede que esto no sea perfecto, pero puede usarlo y modificarlo.
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_width="match_parent" android:layout_height="match_parent" 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_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> <Button android:id="@+id/button11" android:layout_width="wrap_content" android:layout_height="wrap_content" 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_width="fill_parent" android:layout_height="fill_parent" > <NumberPicker android:id="@+id/numberPicker1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="64dp" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" 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_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/button2" android:layout_alignBottom="@+id/button2" android:layout_marginRight="16dp" android:layout_toLeftOf="@+id/numberPicker1" android:text="Set" /> </RelativeLayout>
Editar:
bajo res / valores / 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>
fuente
No resource found that matches the given name (at 'paddingBottom' with value @dimen/activity_vertical_margin)
dimens.xml
. puedes crear el tuyo propio. elimínelos y agregue los suyos. No puedo publicar todo el proyecto.Para mostrar
NumberPicker
enAlertDialog
uso este código: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_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:gravity="center_horizontal"> <NumberPicker android:id="@+id/dialog_number_picker" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout>
fuente
Considere la posibilidad de utilizar una ruleta en lugar de un selector de números en un diálogo. No es exactamente lo que se pidió, pero es mucho más fácil de implementar, tiene un diseño de interfaz de usuario más contextual y debería cumplir con la mayoría de los casos de uso. El código equivalente para un Spinner es:
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);
fuente
Un ejemplo simple:
layout / billing_day_dialog.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <NumberPicker android:id="@+id/number_picker" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_alignParentTop="true" /> <Button android:id="@+id/apply_button" android:layout_width="wrap_content" android:layout_height="wrap_content" 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: especifique el tema de la actividad como tema de diálogo.
<activity android:name="org.npn.analytics.call.NumberPickerActivity" android:theme="@android:style/Theme.Holo.Dialog" android:label="@string/title_activity_number_picker" > </activity>
Espero que te ayude.
fuente
Para los amantes de 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() }
y number_picker_dialog.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:gravity="center_horizontal"> <NumberPicker android:id="@+id/dialog_number_picker" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
fuente