Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 安卓查询onClick和安卓控制流_Java_Android - Fatal编程技术网

Java 安卓查询onClick和安卓控制流

Java 安卓查询onClick和安卓控制流,java,android,Java,Android,我是一个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;

我是一个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
后,我无法使用getter将日期分配给mainactivity中的任何变量,因为
onclick
没有等待我在对话框中完成日期设置

如果我的听众是这样的

    setDoBButton.setOnClickListener(new OnClickListener() {

                public void onClick(View v) {
                    DatePickerFragment newFragment = new DatePickerFragment();
                    newFragment.show(getFragmentManager(), "datePicker");
                    int x = newFragment.getDay();
                }
            });
它不起作用,因为对话框会显示,然后会立即调用
getDay
,因为它在
onclick
中,但对话框中没有设置日期。那么我该如何解决这个问题呢

非常感谢。

使用界面

DatePickerFragment
中定义接口。在活动类中实现接口并使用相同的接口

检查“与活动沟通”下的主题

例如:

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);
    }

}
日期选择器碎片

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);
 }
然后

然后在活动类中实现侦听器

 implements DatePickerFragment.TheListener
您可以实现该方法

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

创建一个名为assignvariables或类似的方法 在
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();
}

创建一个
静态类变量
继续

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循环,您将获得分配给您想要的内容


注意:请注意不要以死锁或错误告终

您需要另一个对象作为DatePickerDialog.OnDateSetListener,以便它可以接收事件。我的大脑刚刚崩溃。非常感谢你的回答,这很有道理,但我永远也想不到:)
int x = newFragment.getDay();
int y = newFragment.getTime();
go_on = false; //and set the boolean to false