2013-08-28 11 views
8

ナビゲーション・ドロワーを実装しましたが、ナビゲーション・ドロワーがクローズする前にフラグメントをロードしたいとします。現在、フラグメントはドロワのクローズと並行して読み込まれます。したがって、フラグメントが重い場合、ユーザインタフェースがちょっとハングします。最初に私が(バックグラウンドで)私のフラグメントのロードが表示されるようにナビゲーション・ドロワーが閉じる前にフラグメントをロード

private class DrawerItemClickListener implements 
      ListView.OnItemClickListener { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, 
       long id) { 
       FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
       ft.replace(R.id.content_frame, fragmentProfile); 
       ft.commit(); 
       drawerLayout.closeDrawer(drawerNaviListView); 
     } 
    } 

がどのように私はこれを変更することができますし、それはロードが終了したときに、ナビゲーション引き出しが閉じ:

私が持っているコードはありますか?

答えて

3

私のソリューションは、引き出しが閉じられた後の断片をロードすることでした: は実際にonDrawerClosed

public void onDrawerClosed() { 

// assure the request comes from selecting a menu item, not just closing tab 
if (selectedTab) 
    selectItem(mSelectedFragment); 
    selectedTab = false; 
} 
2

DrawerLayout.DrawerListenerを使用すると、ドロワービューの状態とモーションを監視できます。 のアニメーション中にレイアウトなどの高価な操作を実行しないようにしてください。 は吃音です。 STATE_IDLE状態で高価な操作を実行してください。 Source

つまり、Fragmentsを交換する前に、引き出しが閉じられるのを待つことをおすすめします。

3

内loadFragmentメソッドを呼び出して、引き出しが遅延実行を作成するために 使用ハンドラを閉じた後にロードするようにしてください。いずれかの引き出しは方法onItemClick()内部

を閉じたときにハングアップがされないように、以下のコードを使用します。それはAsyncTaskを作成

であることの

Handler handler = new Handler(); 

Runnable runnable = new Runnable() { 

      @Override 
      public void run() { 
       FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
      ft.replace(R.id.content_frame, fragmentProfile); 
      ft.commit(); 

      } 
     }; 

     handler.postDelayed(runnable, 500); // here 500 is the delay 

//他の方法をとdoInBackground()メソッドでフラグメントトランザクションを開始し、onPostExecute()のドロワーを閉じます。

+1

上記の解決策は正しいですが、ft.commit()をft.commitAllowingStateLoss()に置き換えてください。あなたの破片の状態は、前に持ち込む前に損失になるためです。 – Sivakumar

関連する問題