web-dev-qa-db-fra.com

Comment créer un dialogue de sélection de numéro?

Je veux pouvoir créer un dialogue qui permet à l'utilisateur de choisir un numéro dans une plage spécifiée.

Je sais qu'il existe déjà des widgets (comme ceux de quietlycoding et celui de SimonVT), mais j'ai du mal à les intégrer correctement dans mon application. En outre, ce sont principalement des widgets. Je veux quelque chose de très similaire à celui du tutoriel de la page de développeurs Android.

J'ai également consulté la documentation du NumberPicker et il m'a été dit d'aller voir les exemples TimePicker et DatePicker, mais ils ne montrent que l'utilisation des sélecteurs de date et d'heure et j'ai du mal à comprendre le code et à convertir le code. Time Picker à juste un nombre normal. Est-ce que quelqu'un a une idée par où commencer? Cela fait 3 heures que je cherche des solutions sans succès.

64
Razgriz

J'ai fait une petite démo de NumberPicker. Cela peut ne pas être parfait, mais vous pouvez utiliser et modifier les mêmes.

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>

Modifier:

sous 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>
99
Raghunandan

Pour afficher NumberPicker dans AlertDialog, utilisez ce code:

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>
14
Kapil Rajput

Envisagez d'utiliser un Spinner au lieu d'un sélecteur de nombre dans un dialogue. Ce n'est pas exactement ce qui était demandé, mais il est beaucoup plus facile à mettre en œuvre, une conception d'interface utilisateur plus contextuelle et devrait remplir la plupart des cas d'utilisation. Le code équivalent pour un spinner est:

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);
8
GLee

Un exemple 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: spécifiez le thème de l'activité en tant que thème de dialogue.

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

J'espère que ça va aider.

5
NEERAJ SWARNKAR

Pour les amateurs 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()
    }

et 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"/>
1
Bozzo Game