4

私は現在Fragment、HC互換性パッケージを使用してマルチペイン化されたビューでアプリをテストしており、向きの変更を処理するのが難しいことがたくさんあります。

私のHostアクティビティには、横向き(menuFramecontentFrame)の2つのペインがあり、縦向きのみmenuFrameで、適切なフラグメントがロードされます。両方のペインに何かがあるが、向きを縦向きに変更すると、(存在しない)フラグメントにビューを読み込もうとするため、NPEが取得されますcontentFrame。コンテンツフラグメントでメソッドを使用してsetRetainState()も機能しませんでした。システムが表示されないフラグメントをロードしないようにするには、どうすればこれを整理できますか?

どうもありがとう!

4

3 に答える 3

3

onCreateViewMethodが問題を引き起こしていたようです。コンテナがnullの場合、nullを返す必要があります。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {   
    if (container == null) // must put this in
        return null;
    return inflater.inflate(R.layout.<layout>, container, false);
}
于 2011-08-10T15:29:44.117 に答える
0

おそらく理想的な答えではありませんが、ポートレートがあり、アクティビティでsavedInstanceStateがnullcontentFrameの場合にのみロードする場合は、コンテンツフレームフラグメントが向きの変更時に表示されます。menuFrame

ただし、戻るボタンを(必要な回数だけ)押すと、にロードされていないため、メニューフラグメントが表示されることはありませんcontentFrame

FragmentLayout APIデモが、方向を変更しても正しいフラグメント状態を保持しないのは残念です。とにかく、この問題をかなり考えて、いろいろ試してみましたが、正解かどうかはわかりません。私がこれまでに思いついた(テストされていない)最良の答えは、縦向きと横向きで同じレイアウトを使用するmenuFrameことですが、に何かがある場合は非表示にしdetailsFrameます。同様にそれを表示frameLayoutし、後者が空の場合は非表示にします。

于 2011-06-06T14:22:18.940 に答える
0

初めて新しいインスタンスを作成します。

これでうまくいき
ます。アクティビティが初めて開始されたときに新しいフラグメントのインスタンスを作成し、それ以外の場合は古いフラグメントを再利用します。
どうすればこれを行うことができますか?
FragmentManagerが鍵です

コードスニペットは次のとおりです。

if(savedInstanceState==null) {
    userFragment = UserNameFragment.newInstance();
    fragmentManager.beginTransaction().add(R.id.profile, userFragment, "TAG").commit();
}
else {
    userFragment = fragmentManager.findFragmentByTag("TAG");
}

フラグメント側でデータを保存する

フラグメントにEditText、TextViews、または方向の変更中に保存するその他のクラス変数がある場合。保存し てメソッドonSaveInstanceState()で取得しますonCreateView()

コードスニペットは次のとおりです。

// Saving State

@Override
public void onSaveInstanceState(Bundle outState) {
     super.onSaveInstanceState(outState);
     outState.putString("USER_NAME", username.getText().toString());
     outState.putString("PASSWORD", password.getText().toString());
}

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

     View view = inflater.inflate(R.layout.user_name_fragment, parent, false);

     username = (EditText) view.findViewById(R.id.username);
     password = (EditText) view.findViewById(R.id.password);


     // Retriving value

     if (savedInstanceState != null) {
         username.setText(savedInstanceState.getString("USER_NAME"));
         password.setText(savedInstanceState.getString("PASSWORD"));
     }

     return view;
}

あなたはここで完全に機能するコードを見ることができます

于 2018-12-31T15:06:44.357 に答える