4

フラグメントから始めて、問題に直面しています。画面の回転後にフラグメントを復元したくありません。私のアプリは次のようになります。横向きでは、左側の領域にボタンがあり、右側の領域のラベルを更新します。ポートレート モードの場合は、新しいアクティビティに移動しています。ただし、回転後にフラグメントの状態を維持したくありません。コードは次のようになります。

左エリアのフラグメント:

public class ListFragment extends Fragment implements OnClickListener {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_list, container, false);
    Button button = (Button) view.findViewById(R.id.button1);
    button.setOnClickListener(this);

    return view;
}

@Override
public void onClick(View v) {

    switch (v.getId()) {

    case R.id.button1:
        updateDetail();
        break;

    }
}

public void updateDetail() {
    String newTime = String.valueOf(System.currentTimeMillis());
    DetailFragment fragment = (DetailFragment) getFragmentManager()
            .findFragmentById(R.id.detailFragment);
    if (fragment != null && fragment.isInLayout()) {
        fragment.setText(newTime);
    } else {
        Intent intent = new Intent(getActivity().getApplicationContext(),
                DetailActivity.class);
        intent.putExtra("value", newTime);
        startActivity(intent);
    }
}

}

右側のアクティビティ:

public class DetailActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
        finish();
        return;
    }       

    if (savedInstanceState == null) {
        setContentView(R.layout.activity_detail);
        Bundle extras = getIntent().getExtras();
        if (extras != null) {
            String s = extras.getString("value");
            TextView view = (TextView) findViewById(R.id.detailsText);
            view.setText(s);
        }
    }
}

}

右側の領域のフラグメント:

public class DetailFragment extends Fragment {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View view = inflater
            .inflate(R.layout.fragment_detail, container, false);

    return view;
}

public void setText(String item) {
    TextView view = (TextView) getView().findViewById(R.id.detailsText);
    view.setText(item);
}

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

    FragmentManager fm = getFragmentManager();

    DetailFragment fragment = (DetailFragment)fm.findFragmentById(R.id.detailFragment);

    if (fragment == null) {
        fragment = new DetailFragment();
        fragment.setTargetFragment(this, 0);
        fm.beginTransaction().add(R.id.detailFragment, fragment).commit();
    } 
}

}

何が間違っている可能性がありますか?

4

2 に答える 2

-1

いくつかの方法でバンドルを使用して、フラグメントの状態を保存および復元できるオプションがいくつかあります。

または、 setRetainInstanceメソッドを使用することもできます。

onCreate(Bundle save)
{
   super.onCreate(save);
   setRetainInstance(true);
}

setRetainInstance メソッドは、バックスタック内のフラグメントに対しては機能しないことに注意してください。

于 2013-05-24T14:23:51.307 に答える