2014-01-14 24 views
5

ここに私のコードです。 'currentFragment'は、現在表示されているものを追跡するフィールドです。これは、それ自身がフラグメントであるクラスにあります(したがって、フラグメントを示すフラグメントがあります)。フラグメントのonCreateView()が呼び出されないようにするにはどうすればよいですか?

private void selectNavBarItem(NavbarItem v) 
{ 
    Fragment fragmentToUse = null; 

    if (v == setpointsNavItem) 
    { 
     fragmentToUse = setpointsFragment; 
    } 
    else if (v == rapidSetupNavItem) 
    { 
     fragmentToUse = rapidSetupFragment; 
    } 
    else if (v == outdoorResetNavItem) 
    { 
     fragmentToUse = outdoorResetFragment; 
    } 
    else if (v == rampDelayNavItem) 
    { 
     fragmentToUse = rampDelayFragment; 
    } 

    if (fragmentToUse != null) 
    { 
     FragmentManager fm = getFragmentManager(); 
     FragmentTransaction ft = fm.beginTransaction(); 

     if (currentFragment != null) 
     { 
      ft.detach(currentFragment); 
     } 

     currentFragment = fragmentToUse; 

     if (currentFragment.isDetached()) 
     { 
      ft.attach(currentFragment); 
     } 
     else 
     { 
      ft.add(R.id.setup_content_holder, currentFragment); 
     } 

     ft.addToBackStack(null); 
     ft.commit(); 
    } 

すべてが偉大に見えるが、ビューは、すべてのフラグメント(onCreateView()とonViewCreated())のために再作成なっています。私は、着脱がうまくいくことを期待していましたが、そうではありません。私がビューを維持したい理由は、ユーザーが選択したものが、彼らが戻ってくるときにそこに残っているからです。

もう1つのオプションが表示され、隠れていますが、このコードを所有するフラグメントに追加したいフラグメントを保持するFrameLayout(R.id.setup_content_holder)があるため、その作業を行う方法がわかりません。 4つのフラグメントを追加するだけではなく、3つのフラグメントを隠すことはできません。コンテナのないフラグメントを追加するオプションがありますが、どのように動作するはずです。

だから、どんなアイデアですか?

答えて

1

OnCreateViewメソッドは、常にフラグメント内で呼び出されます。

問題を解決するには、フラグメントの状態を保存してから、アプリケーションが保存した内容を復元する必要があります。

(問題のフラグメントクラス内):

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState); 
    savedInstanceStatePutString("userString", someTextView.getText().toString()); 
    savedInstanceStatePutInt("userInt", userInt); 
    // etc... 
} 

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    someTextView.setText(savedInstanceState.getString("userString")); 
    userInt = savedInstanceState.getInt("userInt"); 
} 

フラグメント間をホッピングする間に問題が解決するはずです。フラグメントがスタックにプッシュまたはプルされると、アプリケーションはonSaveInstanceStateおよびonRestoreInstanceStateを呼び出します。

しかし、永遠にそれらを保存しません!より多くの永続ストレージが必要な場合は、sqliteデータベースに保存するなどの他のオプションを調べてください。

+1

私はバンドルを使用したくありません。フィールドを変更すると、コンパイル時のチェックの不足はもちろんのこと、メンテナンスが多くなります。あなたの答えに違反することはありません - 私はAndroidが私にそれをやりたいと思う方法だと確信しています。私の新しいアプローチ(私の新しい答えを見てください)が良いアイデアかどうかは分かりますか? –

1

ここには、

私はここで何かをハッキングしました。それはいいアイデアだと思います。私はビューを保持するフラグメントを持っています。ビューには、保存したいものがすべて含まれています(短期間では、これはRAMより永続的ではないと思われます)。フラグメントがonCreateView()を呼び出すと、すでに作成されたビューが返されます。

今、Viewがフラグメントマネージャによって削除されていない問題が発生しました。私はそれが親から削除されていることを確認するためにonPause()の呼び出しを追加しました。

すべてうまくいくようですが、私は本当に悪いことをやっていないことを確認したいと思います。私はAndroidが本当に実際にビューのライフサイクル自体を管理したいと思っていますが、毎回それを作り直したくはありません。それらは複雑で、私はすべてのサブビューテキスト/イメージ/状態を再初期化することに対処したくありません。 Androidの通常の操作手順を実行しようとした際に問題にぶつかるのですか?

EDIT:コード忘れてしまった:

public class OutdoorResetFragment extends Fragment 
{ 
private OutdoorResetView view; 

public OutdoorResetFragment() 
{ 

} 

public void onAttach(Activity activity) 
{ 
    if (view == null || view.getContext() != activity) 
    { 
     view = new OutdoorResetView(activity); 
    } 

    super.onAttach(activity); 
} 

public void onPause() 
{ 
    super.onPause(); 

    ViewGroup container = (ViewGroup) view.getParent(); 

    if (container != null) 
    { 
     container.removeAllViews(); 
    } 
} 

@Override 
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, 
     final Bundle savedInstanceState) 
{ 
    return view; 
} 

public OutdoorResetView getView() 
{ 
    return view; 
} 
} 
8

これはあなたのfrgmentビューのR-作成の問題を解決する、これを試してみてくださいを。

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     if (mFragmentView != null) { 
      ((ViewGroup) mFragmentView.getParent()).removeView(mFragmentView); 
      return mFragmentView; 
     } 

     mFragmentView = inflater.inflate(R.layout.home_fragment, container, false); 

     ..... // your remaining code 
} 
+3

これはアンドロイドの開発者が通常行うことですか? – Eyeball

関連する問題