在我的布局XML中插入<DatePicker>
元素会导致我的应用崩溃:
java.lang.ClassCastException:android.widget.LinearLayout无法强制转换为android.widget.CalendarView $ WeekView
在我的游标加载之前可见,但是格式错误并且不显示月中的日期:
为了演示,这里是一个示例布局XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<DatePicker
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ListView
android:id="@android:id/list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
这里有一些java:
public class TestDatePicker extends ListActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_date_picker);
DatePickerAdapter myAdapter = new DatePickerAdapter();
setListAdapter(myAdapter);
}
}
class DatePickerAdapter extends BaseAdapter {
@Override
public int getCount() { return 0; }
@Override
public Object getItem(int i) { return null; }
@Override
public long getItemId(int i) { return 0; }
@Override
public View getView(int i, View view, ViewGroup viewGroup) { return null;}
}
我已经发现,在这个简单的示例中,我的<DatePicker>
搞砸了,因为setListAdapter()
正在控制ListView
中使用的DatePicker
而不是ListView
我的XML中的DatePicker
。在ListView
之后放置DatePicker
可以解决问题,但这似乎很脆弱。我猜@android:id/list
的列表也使用了setListAdapter()
?
这是一个错误吗?我错误地使用{{1}}了吗?我应该完全避免在ListActivity中使用DatePicker吗?
答案 0 :(得分:1)
是的,看起来确实DatePicker使用具有相同标识符的列表。 Android框架开发人员推荐的是将DatePicker托管在自己的DialogFragment(http://developer.android.com/guide/topics/ui/controls/pickers.html)中。因为你在DialogFragment中不需要它,我建议将DatePicker放在它自己的Fragment中(如果它应该是显示的一部分而不是对话框)并让ListView对象成为ListFragment的一部分并让你的活动显示这两个片段。这样,他们中的任何一方都不会互相交流,你仍然会得到预期的行为。
另外在旁注中,我通常只在必须显示列表(可能是一个简单的小部件)时才使用ListActivity。当你必须使用ViewGroups(如在DatePicker,TimePicker等中)时,最好不要因为你提到的原因而特别使用ListActivity - 这些小部件的固定列表可能已经在使用相同的标识符