1

内部MainActivityに複数のフラグメントがあり、方向の変更のみを構成したいDetailFragment

public class DetailFragment extends Fragment{
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {

            WindowManager wm = getActivity().getWindowManager();

            Display d = wm.getDefaultDisplay();
            if(d.getWidth() > d.getHeight()){
                mDetailView = inflater.inflate(R.layout.detail, container, false);
            }else{
                mDetailView = inflater.inflate(R.layout.detail_port, container, false);
            }
            gridView = (GridView)mDetailView.findViewById(R.id.grid);
        return mDetailView;
        }
}

だから、私は以下でオーバーライドonConfigurationChangedする必要がありますSubTopicFragmentSubTopicFragment extend ListFragment

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    updateDetial(topic_index, args.getString("group_id"), args.getString("group_name"));
}

public void updateDetial(int subTopicPosition,String groupID, String groupName){
    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction ft = fragmentManager.beginTransaction();
    DetailFragment detailView = (DetailFragment)getFragmentManager()
                                .findFragmentById(R.id.detailFrame);
    DetailFragment detailFrag = new DetailFragment(topic_index, subTopicPosition, groupID, groupName);

    if(detailView==null){

        ft.add(R.id.detailFrame, detailFrag);
        ft.commit();
    }else{
        ft.replace(R.id.detailFrame, detailFrag);
        ft.commit();
    }
}

それはうまくいきます。しかし、別のアクティビティに移動し、向きを変えて戻るボタンを押すと、問題が発生します。これにより、強制終了が発生します。これを修正するにはどうすればよいですか。

06-13 10:15:54.758: E/AndroidRuntime(1050): FATAL EXCEPTION: main
06-13 10:15:54.758: E/AndroidRuntime(1050): java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
06-13 10:15:54.758: E/AndroidRuntime(1050):     at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1192)
06-13 10:15:54.758: E/AndroidRuntime(1050):     at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1203)
06-13 10:15:54.758: E/AndroidRuntime(1050):     at android.app.BackStackRecord.commitInternal(BackStackRecord.java:557)
06-13 10:15:54.758: E/AndroidRuntime(1050):     at android.app.BackStackRecord.commit(BackStackRecord.java:541)
06-13 10:15:54.758: E/AndroidRuntime(1050):     at com.april.android.SubTopicFragment.updateDetial(SubTopicFragment.java:120)
06-13 10:15:54.758: E/AndroidRuntime(1050):     at com.april.android.SubTopicFragment.onConfigurationChanged(SubTopicFragment.java:259)
06-13 10:15:54.758: E/AndroidRuntime(1050):     at android.app.FragmentManagerImpl.dispatchConfigurationChanged(FragmentManager.java:1706)
06-13 10:15:54.758: E/AndroidRuntime(1050):     at android.app.Activity.onConfigurationChanged(Activity.java:1402)
06-13 10:15:54.758: E/AndroidRuntime(1050):     at android.app.ActivityThread.performConfigurationChanged(ActivityThread.java:3298)
06-13 10:15:54.758: E/AndroidRuntime(1050):     at android.app.ActivityThread.handleActivityConfigurationChanged(ActivityThread.java:3427)
06-13 10:15:54.758: E/AndroidRuntime(1050):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1113)
06-13 10:15:54.758: E/AndroidRuntime(1050):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-13 10:15:54.758: E/AndroidRuntime(1050):     at android.os.Looper.loop(Looper.java:132)
06-13 10:15:54.758: E/AndroidRuntime(1050):     at android.app.ActivityThread.main(ActivityThread.java:4123)
06-13 10:15:54.758: E/AndroidRuntime(1050):     at java.lang.reflect.Method.invokeNative(Native Method)
06-13 10:15:54.758: E/AndroidRuntime(1050):     at java.lang.reflect.Method.invoke(Method.java:491)
06-13 10:15:54.758: E/AndroidRuntime(1050):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
06-13 10:15:54.758: E/AndroidRuntime(1050):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
06-13 10:15:54.758: E/AndroidRuntime(1050):     at dalvik.system.NativeStart.main(Native Method)
4

2 に答える 2

0

onCreateViewにロードする2つの異なるレイアウトIDは必要ありません

両方のレイアウトに1つのレイアウトIDを使用する

あなたにできることは

レイアウトフォルダ内のR.layout.detail

R.layout.detail_portの名前をR.layout.detailに変更し、resのlayout-portフォルダーに配置します。

次に、inflater.inflate(R.layout.detail、container、false); 向きに基づいて特定のレイアウトを自動的に与えます

このドキュメントを読むhttp://developer.android.com/guide/topics/resources/pproving-resources.html

于 2012-06-13T05:00:41.070 に答える
0

あなたのコードに関するほとんどすべてが間違っています。

        Display d = wm.getDefaultDisplay();
        if(d.getWidth() > d.getHeight()){
            mDetailView = inflater.inflate(R.layout.detail, container, false);
        }else{
            mDetailView = inflater.inflate(R.layout.detail_port, container, false);
        }
        gridView = (GridView)mDetailView.findViewById(R.id.grid);

これを行わないでください-プラットフォームには、命名規則を使用してレイアウトをロードする独自の方法があります。コードは次のようになります。

    mDetailView = inflater.inflate(R.layout.detail, container, false);
    gridView = (GridView)mDetailView.findViewById(R.id.grid);

異なる方向で異なって見えるようにしたい場合は、両方に2つのdetail.xmlファイルを配置するlayout-portlayout-land、OSが正しいファイルをロードします(問題となる可能性のあるすべてのリソースIDの重複排除を処理します)。また:

DetailFragment detailView = (DetailFragment)getFragmentManager()
                            .findFragmentById(R.id.detailFrame);
DetailFragment detailFrag = new DetailFragment(topic_index, subTopicPosition, groupID, groupName);

if(detailView==null){

    ft.add(R.id.detailFrame, detailFrag);
    ft.commit();
}else{
    ft.replace(R.id.detailFrame, detailFrag);
    ft.commit();
}

すでに存在するフラグメントにアクセスできます。次に、まったく新しいフラグメントを作成します。次に、新しいフラグメントを追加する前に、最初のフラグメントがnullかどうかを確認しますか?.add()と.replace()は異なります。これは、add()が特に前のフラグメントを削除しないためです。ただし、削除する前のフラグメントがない場合は、replace()はエラーをスローしないため、毎回これを使用できます。 。

    ft.replace(R.id.detailFrame, new DetailFragment(topic_index, subTopicPosition, groupID, groupName);
    ft.commit();
于 2012-06-13T09:49:04.700 に答える