1. ホーム
  2. android

[解決済み] 方向転換時のフラグメンテーションの扱い方のコツ

2023-04-15 11:40:34

質問

public class MainActivity extends Activity implements MainMenuFragment.OnMainMenuItemSelectedListener {

 @Override
 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager
            .beginTransaction();

    // add menu fragment
    MainMenuFragment myFragment = new MainMenuFragment();
    fragmentTransaction.add(R.id.menu_fragment, myFragment);

    //add content
    DetailPart1 content1= new DetailPart1 ();
    fragmentTransaction.add(R.id.content_fragment, content1);
    fragmentTransaction.commit();

}
public void onMainMenuSelected(String tag) {
  //next menu is selected replace existing fragment
}

2つのリストビューを並べて表示し、左側にメニュー、右側にコンテンツを表示する必要があります。デフォルトでは、最初のメニューが選択され、そのコンテンツが右側に表示されます。コンテンツを表示するFragmentは以下の通りです。

public class DetailPart1 extends Fragment {
  ArrayList<HashMap<String, String>> myList = new ArrayList<HashMap<String, String>>();
  ListAdapter adap;
  ListView listview;

  @Override
  public void onActivityCreated(Bundle savedInstanceState) {
      super.onActivityCreated(savedInstanceState);

       if(savedInstanceState!=null){
        myList = (ArrayList)savedInstanceState.getSerializable("MYLIST_obj");
        adap = new LoadImageFromArrayListAdapter(getActivity(),myList );
        listview.setAdapter(adap);
       }else{
        //get list and load in list view
        getlistTask = new GetALLListTasks().execute();
    }


     @Override
   public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.skyview_fragment, container,false);
           return v;
        }


     @Override
      public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
          outState.putSerializable("MYLIST_obj", myList );
        }
    }

onActivityCreatedとonCreateViewを呼び出します。 2回 . フラグメントを使用した例は、世の中にたくさんあります。私はこのテーマでは初心者なので、私の問題と例を関連付けることができません。私は方向転換を処理するための確実な方法が必要です。私は宣言していません android:configChanges マニフェストファイルで宣言していません。私は、ランドスケープモードで異なるレイアウトを使用できるように、アクティビティを破棄して再作成する必要があります。

どのように解決するのですか?

アクティビティで画面を回転させるたびに、新しいフラグメントが作成されている onCreate(); しかし、古いものを維持するために super.onCreate(savedInstanceState); . そこで、タグを設定して、フラグメントが存在する場合はそれを見つけるか、superにnull bundleを渡すとよいでしょう。

これは学ぶのに時間がかかり、viewpagerのようなものを使っているときには本当に苦痛になります。

私は、以下の本を読むことをお勧めします。 フラグメント を読むことをお勧めします。

ここでは、通常の方向転換の際にフラグメントをどのように処理するかの例を示します。

アクティビティ :

public class MainActivity extends FragmentActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        if (savedInstanceState == null) {
            TestFragment test = new TestFragment();
            test.setArguments(getIntent().getExtras());
            getSupportFragmentManager().beginTransaction().replace(android.R.id.content, test, "your_fragment_tag").commit();
        } else {
            TestFragment test = (TestFragment) getSupportFragmentManager().findFragmentByTag("your_fragment_tag");
        }
    }
}

フラグメント :

public class TestFragment extends Fragment {

    public static final String KEY_ITEM = "unique_key";
    public static final String KEY_INDEX = "index_key";
    private String mTime;
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_layout, container, false);
        
        if (savedInstanceState != null) {
            // Restore last state
            mTime = savedInstanceState.getString("time_key");
        } else {
            mTime = "" + Calendar.getInstance().getTimeInMillis();
        }
        
        TextView title = (TextView) view.findViewById(R.id.fragment_test);
        title.setText(mTime);
        
        return view;
    }
    
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("time_key", mTime);
    }
}