Chcę mieć możliwość utworzenia okna dialogowego, które umożliwia użytkownikowi wybranie liczby z określonego zakresu.
Wiem, że istnieją już widżety (jak te z quietlycoding i ten autorstwa SimonVT), które już to robią, ale mam trudności z poprawnym zintegrowaniem ich z moją aplikacją. Są to również przede wszystkim widżety. Chcę czegoś bardzo podobnego do tego w samouczkach dla programistów Androida.
Sprawdziłem również dokumentację dla NumberPicker i powiedziałem, żebym poszedł sprawdzić przykłady TimePicker i DatePicker, ale pokazują one tylko, jak używać selektorów czasu i daty i mam trudności z poruszaniem się po kodzie i próbą konwersji Time Picker do zwykłego wybierania liczb. Czy ktoś ma pomysł od czego zacząć? Szukałem rozwiązań przez ostatnie 3 godziny, ale bezskutecznie.
setView()
metodyAlertDialog.Builder
jest łatwiejsze i prostsze. Oto przykładowy kod.Odpowiedzi:
Zrobiłem małe demo NumberPicker. To może nie być idealne, ale możesz używać i modyfikować to samo.
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>
Edytować:
pod 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>
źródło
No resource found that matches the given name (at 'paddingBottom' with value @dimen/activity_vertical_margin)
dimens.xml
. możesz stworzyć własne. usuń je i dodaj własne. nie mogę opublikować całego projektu.Aby pokazać
NumberPicker
wAlertDialog
użyciu tego kodu: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>
źródło
Rozważ użycie pokrętła zamiast selektora liczb w oknie dialogowym. Nie jest to dokładnie to, o co pytano, ale jest znacznie łatwiejsze do wdrożenia, bardziej kontekstowe projektowanie interfejsu użytkownika i powinno spełniać większość przypadków użycia. Odpowiedni kod dla Spinner to:
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);
źródło
Prosty przykład:
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: określ motyw dla działania jako motyw dialogu.
<activity android:name="org.npn.analytics.call.NumberPickerActivity" android:theme="@android:style/Theme.Holo.Dialog" android:label="@string/title_activity_number_picker" > </activity>
Mam nadzieję, że to pomoże.
źródło
Dla miłośników 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() }
i 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"/>
źródło