3

Я изучаю основы программирования android и имею некоторые проблемы с NumberPicker.NumberPicker не работает внутри DialogFragment

Я близок к тому, что хочу, открывается диалоговое окно, и появляются кнопки выбора количества часов и минут, но для их прокрутки нет цифр сверху и снизу. Я также не могу редактировать номера с помощью клавиатуры, которая появляется. Я попытался добавить слушателя onValueChange, но он не генерировал никаких событий, когда я использовал клавиатуру.

Может кто-нибудь предложить совет о том, как исправить это? Я заметил, что есть много вещей, которые я пытаюсь сделать с виджетами в определенных действиях или фрагментах, которые не поддерживаются в этом конкретном классе.

Ниже приведены фрагменты соответствующего кода и изображения:

У меня есть класс ClockActivity с двумя кнопками:

... 
public class ClockActivity extends ActionBarActivity { 

... 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_clock); 

    // Define gui objects 
    ... 
    mWorkForTime   = (Button)findViewById(R.id.work_for_time); 
    mBreakForTime   = (Button)findViewById(R.id.break_for_time); 

    // Add listeners for the work for/break for buttons 
    mWorkForTime.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // Bring up the picker fragment 
      DialogFragment newFragment = TimePickerFragment.newInstance(R.string.work_title); 
      newFragment.show(getSupportFragmentManager(), "WorkTimePicker"); 
     } 
    }); 
    mBreakForTime.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // Bring up the picker fragment 
      DialogFragment newFragment = TimePickerFragment.newInstance(R.string.break_title); 
      newFragment.show(getSupportFragmentManager(), "BreakTimePicker"); 
     } 
    }); 
    ... 

Класс TimePickerFragment расширяет DialogFragment:

public class TimePickerFragment extends DialogFragment { 
    // Setup the time pickers 
    private NumberPicker mHourPicker; 
    private NumberPicker mMinutePicker; 

    public static TimePickerFragment newInstance(int title) { 
     TimePickerFragment fragment = new TimePickerFragment(); 
     Bundle args = new Bundle(); 
     args.putInt("title", title); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     super.onCreateDialog(savedInstanceState); 

     int title = getArguments().getInt("title"); 

     LayoutInflater inflater = getActivity().getLayoutInflater(); 

     View view = (View)inflater.inflate(R.layout.activity_time_picker, null); 

     // Initialize the pickers 
     mHourPicker = (NumberPicker)view.findViewById(R.id.hours_picker); 
     mMinutePicker = (NumberPicker)view.findViewById(R.id.minutes_picker); 
     mHourPicker.setMinValue(0); 
     mMinutePicker.setMinValue(0); 
     mHourPicker.setMaxValue(24); 
     mMinutePicker.setMaxValue(59); 


     Dialog alertDialog = new AlertDialog.Builder(getActivity()) 
       .setTitle(title) 
       .setView(inflater.inflate(R.layout.activity_time_picker, null)) 
       .setNegativeButton(R.string.negate, 
         new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, int which) { 
           ((ClockActivity) getActivity()).doNegativeTimeDialogClick(); 
          } 
         }) 
       .setPositiveButton(R.string.confirm, 
         new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, int which) { 
           ((ClockActivity) getActivity()).doPositiveTimeDialogClick(); 
          } 
         }) 
       .create(); 
     return alertDialog; 
    } 
} 

Далее следует XML для представления DialogFragment, который находится в

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <LinearLayout 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content"> 

      <TextView 
       android:layout_width="0dp" 
       android:layout_weight="1" 
       android:layout_height="wrap_content" 
       android:gravity="center" 
       android:text="@string/hours" 
       android:textSize="24sp" 
       android:textStyle="bold"/> 

      <TextView 
       android:layout_width="0dp" 
       android:layout_weight="1" 
       android:layout_height="wrap_content" 
       android:gravity="center" 
       android:text="@string/minutes" 
       android:textSize="24sp" 
       android:textStyle="bold"/> 

     </LinearLayout> 

     <LinearLayout 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content"> 

      <NumberPicker 
       android:id="@+id/hours_picker" 
       android:layout_width="0dp" 
       android:layout_weight="1" 
       android:layout_height="wrap_content"/> 

      <NumberPicker 
       android:id="@+id/minutes_picker" 
       android:layout_width="0dp" 
       android:layout_weight="1" 
       android:layout_height="wrap_content"/> 

     </LinearLayout> 
    </LinearLayout> 

Вот образ текущей операции:

http://i.imgur.com/4UiSLcn.png

Вот что я ищу, чтобы:

http://www.i-programmer.info/images/stories/Core/Android/Pickers/ten.gif

Вот некоторые выход я вижу на консоли когда я пытаюсь отредактировать NumberPicker с помощью мягкой клавиатуры:

01-02 16:10:46.559 18438-18438/com.example.android.worktimer W/IInputConnectionWrapper﹕ beginBatchEdit on inactive InputConnection 
01-02 16:10:46.569 18438-18438/com.example.android.worktimer W/IInputConnectionWrapper﹕ endBatchEdit on inactive InputConnection 

ответ

2

Вы должны предоставить сборщику массив того, что вы пытаетесь выбрать.

String[] myStringArray = new String[]{"a","b","c"}; 
    mMinutePicker.setMinValue(0); 
    mMinutePicker.setMaxValue(myStringArray.length - 1); 
    mMinutePicker.setDisplayedValues(myStringArray); 

И Изменить

Dialog alertDialog = new AlertDialog.Builder(getActivity()) .setTitle(title) .setView(inflater.inflate(R.layout.activity_time_picker, null)) 

в

Dialog alertDialog = new AlertDialog.Builder(getActivity()).setTitle(title).setView(view) 

Вы снова надувать вид.

+0

Что делать, если мне нужен список номеров? Я пробовал это: 'mHourPicker.setMinValue (0); mMinutePicker.setMinValue (0); ' Похоже, что метод setDisplayedValues ​​() будет принимать только массив строк. – Burke9077

+0

задайте номер в массиве строк, а затем извлеките число из массива, например myStringArray [mMinutePicker.getValue()] –

+0

Или вы можете добавить слушателя к номеру и получить позицию выбранного элемента и найти эту позицию в массиве. –

Смежные вопросы