期望的结果
我想在横向模式下在屏幕的左侧/右侧有带有自定义项目的垂直列表,在纵向模式下在屏幕的顶部/底部有水平列表。水平/垂直列表应该是Fragment
这样我以后可以在智能手机版本中重复使用它。最低 SDK 版本为 13 (Android 3.2)。
我的尝试
我的自定义Activity
有一个自定义LayersFragment
和另一个自定义View
。在纵向模式下,片段与父级的左侧对齐。在横向模式下与父母的底部对齐。
LayersFragment
纵向和横向模式也有不同的布局。在纵向模式下是Gallery
,在横向模式下是ListView
。
因为Gallery
和ListView
是AdapterView<Adapter>
我使用这个父类的子类并BaseAdapter
填充项目和监听OnItemClicks
。
资源详情
frag_layers.xml - 横向 XML 布局LayersFragment
。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
frag_layers.xml - 纵向模式的 XML 布局LayersFragment
。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Gallery
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
activity_photo_editor.xmlActivity
- 我的自定义纵向模式的 XML 布局。横向模式而不是android:layout_alignParentBottom
has的布局android:layout_alignParentLeft
。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<fragment
android:id="@+id/photo_editor_layouts"
class="rs.ailic.android.heritage.ui.LayersFragment"
android:layout_width="match_parent"
android:layout_height="@dimen/photo_editor_layouts_size"
android:layout_alignParentBottom="true" />
<!-- Not relevant. -->
</RelativeLayout>
代码详情
类LayersFragment。
public class LayersFragment extends Fragment implements OnItemClickListener {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.frag_layers, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mLayersAdapter = new LayersAdapter();
mLayersView = (AdapterView<Adapter>) getView().findViewById(android.R.id.list);
mLayersView.setOnItemClickListener(this);
mLayersView.setAdapter(mLayersAdapter);
}
@Override
public void onItemClick(AdapterView<?> adapter, View view, int position, long id) {
//Not implemented
}
private class LayersAdapter extends BaseAdapter {
//Not implemented. Returning 0 in getCount().
}
}
我的自定义活动
public class PhotoEditorActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_photo_editor);
}
//Not relevant
}
问题
从横向旋转到纵向(ListView -> Gallery)时,我得到了这个 ClassCastException
Caused by: java.lang.ClassCastException: android.widget.AbsListView$SavedState cannot be cast to android.widget.AbsSpinner$SavedState
at android.widget.AbsSpinner.onRestoreInstanceState(AbsSpinner.java:421)
at android.view.View.dispatchRestoreInstanceState(View.java:8341)
at android.view.ViewGroup.dispatchThawSelfOnly(ViewGroup.java:2038)
at android.widget.AdapterView.dispatchRestoreInstanceState(AdapterView.java:766)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2024)
at android.view.View.restoreHierarchyState(View.java:8320)
at android.app.Fragment.restoreViewState(Fragment.java:583)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:801)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:977)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:960)
at android.app.FragmentManagerImpl.dispatchStart(FragmentManager.java:1679)
at android.app.Activity.performStart(Activity.java:4413)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1791)
... 12 more
而这个从纵向旋转到横向(图库-> ListView)
Caused by: java.lang.ClassCastException: android.widget.AbsSpinner$SavedState cannot be cast to android.widget.AbsListView$SavedState
at android.widget.AbsListView.onRestoreInstanceState(AbsListView.java:1650)
at android.view.View.dispatchRestoreInstanceState(View.java:8341)
at android.view.ViewGroup.dispatchThawSelfOnly(ViewGroup.java:2038)
at android.widget.AdapterView.dispatchRestoreInstanceState(AdapterView.java:766)
我该如何解决这个问题,或者我应该寻找其他解决方案?
我的意见
屏幕方向更改时会出现问题。我认为问题出在 and 的“默认实现”ListView
中Gallery
。他们尝试在方向更改后恢复其SavedState
in onRestoreInstanceState
,但View
已更改并抛出 ClassCastException。
谢谢,
亚历山大·伊利奇