2013-10-11 3 views
0

Я начинающий программист для Android, и у меня есть этот вопрос.Android-запрос о потоке управления onClick и android

У меня есть класс, как следует ...

import java.util.Calendar; 

import android.app.AlertDialog; 
import android.app.DatePickerDialog; 
import android.app.Dialog; 
import android.app.DialogFragment; 
import android.os.Bundle; 
import android.widget.DatePicker; 

public class DatePickerFragment extends DialogFragment implements 
     DatePickerDialog.OnDateSetListener { 

    private int year; 
    private int month; 
    private int day; 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     // Use the current date as the default date in the picker 
     final Calendar c = Calendar.getInstance(); 
     int year = c.get(Calendar.YEAR); 
     int month = c.get(Calendar.MONTH); 
     int day = c.get(Calendar.DAY_OF_MONTH); 

     // Create a new instance of DatePickerDialog and return it 
     return new DatePickerDialog(getActivity(), 
       AlertDialog.THEME_DEVICE_DEFAULT_DARK, this, year, month, day); 
    } 

    public void onDateSet(DatePicker view, int year, int month, int day) { 
     this.setYear(year); 
     this.setMonth(month); 
     this.setDay(day); 
     System.out.println(day+""+month+""+year); 
     // Do something with the date chosen by the user 
    } 

    public int getYear() { 
     return year; 
    } 

    public void setYear(int year) { 
     this.year = year; 
    } 

    public int getMonth() { 
     return month; 
    } 

    public void setMonth(int month) { 
     this.month = month; 
    } 

    public int getDay() { 
     return day; 
    } 

    public void setDay(int day) { 
     this.day = day; 
    } 
} 

В моей основной деятельности, у меня есть кнопка с слушателя и, когда я нажимаю, он называет этот класс и вызывает диалоговое окно/дата подборщик следующим образом:

setDoBButton.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       DatePickerFragment newFragment = new DatePickerFragment(); 
       newFragment.show(getFragmentManager(), "datePicker"); 
      } 
     }); 

Моя проблема, когда я нажимаю на кнопку, и окно выходит, после того, как я установил свою дату и onDateSet называется, я не могу использовать мои добытчик правопреемник дату любого переменные в моя основная активность, потому что onclick не ждет меня в фи Настройка даты в диалоговом окне.

Например, если мой слушатель был так ...

setDoBButton.setOnClickListener(new OnClickListener() { 

       public void onClick(View v) { 
        DatePickerFragment newFragment = new DatePickerFragment(); 
        newFragment.show(getFragmentManager(), "datePicker"); 
        int x = newFragment.getDay(); 
       } 
      }); 

Он не работал бы потому, что диалоговое окно будет показывать, а затем getDay мгновенно назвать, потому что его в onclick но день hasnt был установлен в в диалоговом окне. Так как я могу обойти это?

Большое спасибо.

+0

вам нужен другой объект чтобы быть DatePickerDialog.OnDateSetListener, чтобы он мог получать событие. – njzk2

ответ

2

Используйте интерфейс.

Определить интерфейс в DatePickerFragment. Внедрите интерфейс в свой класс активности и используйте его.

Проверьте тему под Общение с действительностью.

http://developer.android.com/guide/components/fragments.html

Пример:

public class MainActivity extends Activity implements DatePickerFragment.TheListener{ 

    Button b; 
    TextView tv; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     b= (Button) findViewById(R.id.button1); 
     tv= (TextView) findViewById(R.id.textView1); 
     b.setOnClickListener(new OnClickListener() 
     { 

      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 
       DialogFragment picker = new DatePickerFragment(); 
       picker.show(getFragmentManager(), "datePicker"); 
      } 

     }); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public void returnDate(String date) { 
     // TODO Auto-generated method stub 
     tv.setText(date); 
    } 

} 

DatePickerFragment

public class DatePickerFragment extends DialogFragment 
implements DatePickerDialog.OnDateSetListener { 

    TheListener listener; 

public interface TheListener{ 
    public void returnDate(String date); 
} 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
// Use the current date as the default date in the picker 
final Calendar c = Calendar.getInstance(); 
int year = c.get(Calendar.YEAR); 
int month = c.get(Calendar.MONTH); 
int day = c.get(Calendar.DAY_OF_MONTH); 
listener = (TheListener) getActivity(); 

// Create a new instance of DatePickerDialog and return it 
return new DatePickerDialog(getActivity(), this, year, month, day); 
} 

@Override 
public void onDateSet(DatePicker view, int year, int month, int day) { 
Calendar c = Calendar.getInstance(); 
c.set(year, month, day); 

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
String formattedDate = sdf.format(c.getTime()); 
if (listener != null) 
{ 
    listener.returnDate(formattedDate); // instead of date set the day 

} 

} 
} 

В приведенном выше примере вы имеете интерфейс в DaterPicker

public interface TheListener{ 
    public void returnDate(String date); 
} 

Тогда

listener.returnDate(formattedDate); 

Тогда вы реализуете слушателя в классе активности

implements DatePickerFragment.TheListener 

Вы реализуете метод

@Override 
    public void returnDate(String date) { 
     // TODO Auto-generated method stub 
     tv.setText(date); // date is available here 
    } 
+0

Мой разум только что взорвался. Большое спасибо за этот ответ, он имеет такой смысл, но я бы никогда не смог его найти :) – Ogen

+0

@ Клей метод есть в документах. проверить опубликованную ссылку – Raghunandan

0

Создать метод, называемый Присвоить переменным или что-то вроде этого и на onclick называть этот метод

setDoBButton.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       DatePickerFragment newFragment = new DatePickerFragment(); 
       newFragment.show(getFragmentManager(), "datePicker"); 
       assign_variables(); 
      } 
     }); 

private void assign_variables(){ 
    int x = newFragment.getDay(); 
} 

ИЛИ

Создать static class variable как go_on

private static final boolean go_on = true; 

и теперь вы onclick добавить бесконечный цикл

setDoBButton.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       DatePickerFragment newFragment = new DatePickerFragment(); 
       newFragment.show(getFragmentManager(), "datePicker"); 
       while(go_on){} 
      } 
     }); 

Затем сделать ваше назначение, как вы хотите

int x = newFragment.getDay(); 
int y = newFragment.getTime(); 
go_on = false; //and set the boolean to false 

сейчас сломается время цикла, и вы получите то, что вы назначили, что вы хотите

ПРИМЕЧАНИЕ: Просто позаботиться о том, что вы не заканчиваются в некотором тупике или ошибки ANR

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