Как создать диалоговое окно выбора номера?
Я хочу иметь возможность создать диалоговое окно, которое позволяет пользователю выбрать номер из указанного диапазона.
Я знаю, что существуют виджеты(например, от quietlycoding и от SimonVT), которые уже делают это, но мне трудно интегрировать их правильно в мое приложение. Кроме того, это в первую очередь виджеты. Я хочу что-то очень похожее на то, что есть в учебниках для разработчиков android.
Я также проверил документацию NumberPicker и он сказал, чтобы проверить TimePicker и DatePicker для примеров, но они только показывают, как использовать время и дату выбора, и я с трудом чувствую свой путь вокруг кода и пытается преобразовать время выбора просто обычный номер выбора. Кто-нибудь знает с чего начать? Я искал решения в течение последних 3 часов безрезультатно.
5 ответов:
Я сделал небольшую демонстрацию 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_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>
диалог.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>
Edit:
в разделе 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>
показать
NumberPicker
наAlertDialog
используйте этот код :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>
рассмотрите возможность использования 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);
Простой Пример:
макет/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: укажите тему для действия в качестве темы диалога.
<activity android:name="org.npn.analytics.call.NumberPickerActivity" android:theme="@android:style/Theme.Holo.Dialog" android:label="@string/title_activity_number_picker" > </activity>
надеюсь, что это поможет.
для любителей Котлин.
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_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"/>