望ましい結果
ランドスケープモードでは画面の左側/右側にカスタムアイテムを含む垂直リストを、ポートレートモードでは画面の上部/下部に水平リストを表示したいと思います。水平/垂直リストは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-LayersFragment
ポートレートモードのXMLレイアウト。
<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.xml-Activity
ポートレートモードでのカスタムのXMLレイアウト。android:layout_alignParentBottom
の代わりに横向きモードのレイアウト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
}
問題
横向きから縦向きに回転すると、このClassCastExceptionが発生します(ListView-> Gallery)
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
ポートレートからランドスケープに回転するときのこれ(ギャラリー->リストビュー)
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)
この問題をどのように解決できますか、または別の解決策を探す必要がありますか?
私の意見
画面の向きが変わると問題が発生します。問題はとの「デフォルトの実装」にあるListView
と思いますGallery
。向きを変更SavedState
した後、復元しようとしますが、が変更され、ClassCastExceptionがスローされます。onRestoreInstanceState
View
ありがとうございました、
アレクサンダルイリッチ