我的 ListFragment 和 DatePickerDialog 的问题
Problems with my ListFragment and DatePickerDialog
我是 Android 开发新手,我的 ListFragment 有问题。
我正在尝试使用按钮启动 DatePickerDialog。
我的 ListFragment 中的代码如下:
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
b = (Button) getView().findViewById(R.id.button_set_date);
et = (EditText) getView().findViewById(R.id.editText_choose_date);
b.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
DialogFragment picker = new DatePickerFragment();
picker.show(getActivity().getSupportFragmentManager(), "datePicker");
}
});
@Override
public void returnDate(String date) {
et.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){
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();
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);
}
}
}
点击按钮后,出现以下错误:
java.lang.ClassCastException: MainActivity 无法转换为 DatePickerFragment$TheListener
代码在 "standard" 片段内有效。
在寻找解决方案后,我测试了一些可能性:
1.) 而不是 getSupportFragmentManager
,使用 getFragmentManager
--> “无法解析方法 'show(android.app.FragmentManager.java.lang.String)'
2.) 而不是 'getActivity().getSupportFragmentManager()',仅使用 'getFragmentManager()'
--> 同样是点击按钮后,出现如下错误:
java.lang.ClassCastException: MainActivity 无法转换为 DatePickerFragment$TheListener
3.) 我尝试将导入 import android.support.v4.app.ListFragment;
更改为 android.app.ListFragment;
同样在我的另外两个 "standard" 片段中,我将导入更改为 'android.app.Fragment'
--> 我的 MainActivity 出现问题,因为这部分:
@Override
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
// Return a PlaceholderFragment (defined as a static inner class below).
switch (position){
case 0: return TestListFragment.newInstance("a", "b");
case 1: return TestFragment.newInstance("a","b");
case 2: return TestFragment2.newInstance("a", "b");
default: return PlaceholderFragment.newInstance(position + 1);
}
}
显然我的 MainActivity 无法与 'import android.app.Fragment;' 一起使用并崩溃。
希望你能帮帮我!
你的 ListFragment
的父 Activity
似乎没有实现 TheListener
.
当你打电话给
listener = (TheListener) getActivity();
您正在将 ListFragment
的父级 activity 转换为 TheListener
。
顺便说一下,你要小心这个。如果您旋转屏幕,Activity
将被重新创建,您的 DatePickerFragment
将被分离并重新连接一个新的。旧的 getActivity
方法将 return null.
您应该检查 ListFragment
的 onCreate(View)
方法以查看 DatePickerFragment
的实例是否已经存在(通过标签查找),如果存在,您可以想要重新显示该片段的侦听器并将其重新连接到您的新 activity 而不是创建一个新片段。
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
TheListener listener = null;
public interface TheListener {
public void returnDate(String date);
}
public void onDateSetListener(TheListener listener){
this.listener = listener;
}
@Override
public Dialog onCreateDialog (Bundle savedInstanceState){
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);
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);
}
}
}
当您调用 DatepickerDialog 时:
DatePickerFragment picker = new DatePickerFragment();
picker.onDateSetListener(this);
picker.show(getActivity().getSupportFragmentManager(), "datePicker");
因此您需要实现 TheListener
接口,并且需要在那个特定的 Class:
上覆盖 returnDate
方法
@Override
public void returnDate(String date) {
et.setText(date);
}
我是 Android 开发新手,我的 ListFragment 有问题。 我正在尝试使用按钮启动 DatePickerDialog。 我的 ListFragment 中的代码如下:
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
b = (Button) getView().findViewById(R.id.button_set_date);
et = (EditText) getView().findViewById(R.id.editText_choose_date);
b.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
DialogFragment picker = new DatePickerFragment();
picker.show(getActivity().getSupportFragmentManager(), "datePicker");
}
});
@Override
public void returnDate(String date) {
et.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){
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();
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);
}
}
}
点击按钮后,出现以下错误:
java.lang.ClassCastException: MainActivity 无法转换为 DatePickerFragment$TheListener
代码在 "standard" 片段内有效。
在寻找解决方案后,我测试了一些可能性:
1.) 而不是 getSupportFragmentManager
,使用 getFragmentManager
--> “无法解析方法 'show(android.app.FragmentManager.java.lang.String)'
2.) 而不是 'getActivity().getSupportFragmentManager()',仅使用 'getFragmentManager()' --> 同样是点击按钮后,出现如下错误:
java.lang.ClassCastException: MainActivity 无法转换为 DatePickerFragment$TheListener
3.) 我尝试将导入 import android.support.v4.app.ListFragment;
更改为 android.app.ListFragment;
同样在我的另外两个 "standard" 片段中,我将导入更改为 'android.app.Fragment'
--> 我的 MainActivity 出现问题,因为这部分:
@Override
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
// Return a PlaceholderFragment (defined as a static inner class below).
switch (position){
case 0: return TestListFragment.newInstance("a", "b");
case 1: return TestFragment.newInstance("a","b");
case 2: return TestFragment2.newInstance("a", "b");
default: return PlaceholderFragment.newInstance(position + 1);
}
}
显然我的 MainActivity 无法与 'import android.app.Fragment;' 一起使用并崩溃。
希望你能帮帮我!
你的 ListFragment
的父 Activity
似乎没有实现 TheListener
.
当你打电话给
listener = (TheListener) getActivity();
您正在将 ListFragment
的父级 activity 转换为 TheListener
。
顺便说一下,你要小心这个。如果您旋转屏幕,Activity
将被重新创建,您的 DatePickerFragment
将被分离并重新连接一个新的。旧的 getActivity
方法将 return null.
您应该检查 ListFragment
的 onCreate(View)
方法以查看 DatePickerFragment
的实例是否已经存在(通过标签查找),如果存在,您可以想要重新显示该片段的侦听器并将其重新连接到您的新 activity 而不是创建一个新片段。
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
TheListener listener = null;
public interface TheListener {
public void returnDate(String date);
}
public void onDateSetListener(TheListener listener){
this.listener = listener;
}
@Override
public Dialog onCreateDialog (Bundle savedInstanceState){
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);
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);
}
}
}
当您调用 DatepickerDialog 时:
DatePickerFragment picker = new DatePickerFragment();
picker.onDateSetListener(this);
picker.show(getActivity().getSupportFragmentManager(), "datePicker");
因此您需要实现 TheListener
接口,并且需要在那个特定的 Class:
returnDate
方法
@Override
public void returnDate(String date) {
et.setText(date);
}