0

私は初心者の 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では、どうすればこれを回避できますか?

どうもありがとう。

4

2 に答える 2

1

インターフェイスを使用します。

でインターフェイスを定義します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);
    }

}

DatePickerフラグメント

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
    }
于 2013-10-11T10:39:32.137 に答える
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

これでwhileループが中断され、必要なものを割り当てたものが得られます

注: デッドロックや ANR エラーで終わらないように注意してください。

于 2013-10-11T10:47:01.707 に答える