0

У меня есть вкладка, которая содержит две нижние вкладки. FrameLayout заполняется специальным файлом макета, который я создал. Эти два файла макета выполняются классами Java, которые расширяют класс фрагмента. Это краткое описание того, что у меня есть сейчас.DialogFragment создает несколько диалоговых окон вместо одного

Теперь идет подробная информация о проблеме. Файл макета содержит два поля EditText, которые должны создавать DatePickerDialog при нажатии. Я реализовал диалоги, используя класс DialogFragment, один для обоих текстовых полей. Hovewer, когда я нажимаю на edittexts, они производят несколько диалогов DatePicker, а не один, и неясно, в чем логика. Он может создавать 2, 3 или даже 4 диалоговых окна.

Как исправить эту проблему? Вот мой код:

активность

public class Activity extends AppCompatActivity { 

    FragmentTabHost mFragmentTabHost; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_quick_calculation); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

     mFragmentTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost); 
     mFragmentTabHost.setup(QuickCalculationActivity.this, getSupportFragmentManager(), android.R.id.tabcontent); 

     mFragmentTabHost.addTab(mFragmentTabHost.newTabSpec("days").setIndicator("DAYS"), DaysTabView.class, null); 
     mFragmentTabHost.addTab(mFragmentTabHost.newTabSpec("date").setIndicator("DATE"), DateTabView.class, null); 
    } 
} 

Один из TabView классов

public class DaysTabView extends Fragment { 

/* 
* some code was not included to make easir to read 
*/ 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.days_tab_view, container, false); 
     mFromDate = (EditText) v.findViewById(R.id.fromDate); 

     mFromDate.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       mFromDate.setText(""); 
       SetDateToDefault(1);  //some method 
       Bundle args = new Bundle(); 
       args.putInt("day", day1); 
       args.putInt("month", month1); 
       args.putInt("year", year1); 
       myDatePickerDialogFragment d1 = new myDatePickerDialogFragment(); 
       d1.setArguments(args); 
       d1.setOnDateSetListener(datePickerListener1); //onDateSet Listener that is not included in this question 
       d1.show(getFragmentManager(), "days"); 
       return false; 
      } 
     }); 
    } 
} 

И DialogFragment класс

public class myDatePickerDialogFragment extends DialogFragment{ 

    int mDay, mMonth, mYear; 
    OnDateSetListener onSetDate; 

    public myDatePickerDialogFragment(){ 
    } 

    @Override 
    public void setArguments(Bundle args) { 
     super.setArguments(args); 
     mDay = args.getInt("day"); 
     mMonth = args.getInt("month"); 
     mYear = args.getInt("year"); 
    } 

    public void setOnDateSetListener(OnDateSetListener setDate){ 
     onSetDate = setDate; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     return new DatePickerDialog(getActivity(), onSetDate, mYear, mMonth, mDay); 
    } 
} 

ответ

1

Я рекомендовал бы изменить свой onTouchListener с onClickListener на ваших EditTexts. Причина заключается в том, что прослушиватель прикосновений будет срабатывать каждый раз, когда происходит событие (например, палец вниз, движение пальца, пальцы вверх и т. Д.), Тогда как прослушиватель кликов запускается только один раз.

Так в DaysTabView классе, изменение к этому:

mFromDate.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public boolean onClick(View v) { 
      mFromDate.setText(""); 
      SetDateToDefault(1);  //some method 
      Bundle args = new Bundle(); 
      args.putInt("day", day1); 
      args.putInt("month", month1); 
      args.putInt("year", year1); 
      myDatePickerDialogFragment d1 = new myDatePickerDialogFragment(); 
      d1.setArguments(args); 
      d1.setOnDateSetListener(datePickerListener1); //onDateSet Listener that is not included in this question 
      d1.show(getFragmentManager(), "days"); 
      return false; 
     } 
    }); 
1

возвращающие в setOnTouchListener вместо ложной.

if(event.getAction() == MotionEvent.ACTION_UP){ 

      // Do what you want 
      return true; 
     } 
     return false; 
} 

Это должно быть, как:

mFromDate.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
      if(event.getAction() == MotionEvent.ACTION_UP){ 

       mFromDate.setText(""); 
       SetDateToDefault(1);  //some method 
       Bundle args = new Bundle(); 
       args.putInt("day", day1); 
       args.putInt("month", month1); 
       args.putInt("year", year1); 
       myDatePickerDialogFragment d1 = new myDatePickerDialogFragment(); 
       d1.setArguments(args); 
       d1.setOnDateSetListener(datePickerListener1); //onDateSet Listener that is not included in this question 
       d1.show(getFragmentManager(), "days"); 
       return true; 
      } 
      return false; 
    } 

     }); 
1

onTouchListener Меняйте код

mFromDate.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 

      final int actionPeformed = ev.getAction(); 
      switch(actionPeformed){ 
      case MotionEvent.ACTION_UP:{ 

      mFromDate.setText(""); 
      SetDateToDefault(1);  //some method 
      Bundle args = new Bundle(); 
      args.putInt("day", day1); 
      args.putInt("month", month1); 
      args.putInt("year", year1); 
      myDatePickerDialogFragment d1 = new myDatePickerDialogFragment(); 
      d1.setArguments(args); 
      d1.setOnDateSetListener(datePickerListener1); //onDateSet Listener that is not included in this question 
      d1.show(getFragmentManager(), "days"); 
      break; 
    } 

    return true; 

    } 
}); 
1

может быть, вы должны использовать ClickListener вместо TouchListener