2016-12-21 8 views
1

ほとんどの場合正しく機能する私のアプリケーションにNavigation Drawerを実装しました。フラグメントの場合、引き出しの開閉がスムーズでない

私のHomeタブでは、いくつかの情報を表示するためにいくつかの情報を表示するために、これらの要求と必要な作業負荷があります(最小限であっても)ドロワーの途中が閉まり、滑らかになりません。

私の最初の「解決策」は、のようなto load the fragment only after the Drawer closes、だった:

toggle = new ActionBarDrawerToggle(
      this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) { 

     public void onDrawerClosed(View view) { 
      super.onDrawerClosed(view); 

      displaySelectedScreen(itemSelected.getItemId()); 
     } 
    }; 

しかし、これはフラグメントが表示されます表示する前に0.5秒の待機を作成し、それは非常にユーザーの立場からapealingされていません。ここで

は私activity_main.xmlの一部です:

<android.support.design.widget.NavigationView 
    android:id="@+id/nav_view" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:fitsSystemWindows="true" 
    app:headerLayout="@layout/nav_header_main" 
    app:menu="@menu/activity_main_drawer" /> 

これは私が私のFragmentこれまでのディスプレイ方法である:ここでは

@SuppressWarnings("StatementWithEmptyBody") 
@Override 
public boolean onNavigationItemSelected(final MenuItem item) {  
    displaySelectedScreen(item.getItemId()); 
    drawer.closeDrawer(GravityCompat.START); 
    return true; 
} 

displaySelectedScreenで何が起こるかです:

private void displaySelectedScreen(int itemId) { 
    Fragment fragment; 
    fragment = checkFragment(itemId); // Instantiates the right Fragment 

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.content_frame, fragment); 
    ft.commit(); 

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 

    // Close our Drawer since we have selected a valid item. 
    drawer.closeDrawer(GravityCompat.START); 
} 

私に何をお勧めしますかNavigation Drawerはスムーズに閉じる?

EDIT

要求されたとして、ここで私のAsyncTaskための私のコードは、APIリクエストを行うことで、JSONObject返します:HttpURLConnection経由

/** 
* Requests information from the API via APIRequests 
* Extends AsyncTask in order to do network-related actions in background. 
*/ 
private class SearchInfo extends AsyncTask<Void, Integer, JSONObject> { 

    @Override 
    protected JSONObject doInBackground(Void... params) { 
     JSONObject information; 

     APIRequests apiRequests = new APIRequests(); 
     information = apiRequests.getGameInfo(); 

     requestDone = true; 

     return information; 
    } 
} 

APIRequestの方法は、単純なHTTP GETを行い、取得されたデータと共にJSONObjectを返します。

+0

()でどうなるのか、あなたはdisplaySelectedScreen()でフラグメントをコミットするようですか? – dumazy

答えて

0

APIリクエストを行わずに試したことがありますか?その問題がフラグメントの表示にあるかどうか確認してください。

+0

絶対に、それは要求なしで非常に滑らかです。 –

0

はあなたがAPIリクエストを行うには、別のスレッドを使用していることを確認してください。あなたは、特定のAPIリクエストが何であるかに応じてAsyncTaskLoadersServicesIntentServicesなどを使用することができます。ない上(

データIの表示が頻繁に変更されませんので:Fragmentがすぐに表示することができ、次のように私が使用しているソリューションである

+0

AsyncTaskのバックグラウンドメソッドでAPIリクエストを既に実行しています。 –

+0

AsyncTaskを実行しないと、すべてが円滑に実行されますか?もしそうなら、AsyncTaskのコードも表示できますか? – dumazy

0

をロードされるときに、データがそれに追加することができますその方法毎日少なくとも基本的に)、私は今私のアプリケーションのセッション(プロセス)ごとに一度だけ自分のAPIリクエストを行います。

if (!requestDone) { // Where requestDone == true when I have done an API request 
     getGameInfo(); 
} 

そして、それは(requestDoneの価値を維持するために)インスタンス化されていない場合にのみ、フラグメントをインスタンス化します。

(APIリクエストが完了した時点で終了するスプラッシュ画面があるため)アニメーションは常に流動的です。

データが要求される時間の数は、更新される確率と同等でなければならないことは明らかです。引き出しは

@Override 
public boolean onNavigationItemSelected(final MenuItem item) {  
    displaySelectedScreen(item.getItemId()); // Commit is there 
    drawer.closeDrawer(GravityCompat.START); // And drawer closing simultaneously 
    return true; 
} 

を閉じる前に

1

は、私がdisplaySelectedScreenで何が起こるか

// Create a field that marks that something needs to be displayed 
// after drawer closes. When null means no action (drawer closed 
// by the user, not by selecting an item) 
Integer itemIdWhenClosed; 

@Override 
public boolean onNavigationItemSelected(final MenuItem item) {  
    itemIdWhenClosed = item.getItemId(); // Mark action when closed 
    drawer.closeDrawer(GravityCompat.START); // Close it 
    return true; 
} 

@Override 
public void onDrawerClosed(View view) { 
    super.onDrawerClosed(view); 
    // If id to show is marked, perform action 
    if (itemIdWhenClosed != null) { 
     displaySelectedScreen(itemIdWhenClosed); 
     // Reset value 
     itemIdWhenClosed = null; 
    } 
} 

// Now here just commit, don't close the drawer since this is already 
// fired when it's closed 
private void displaySelectedScreen(int itemId) { 
    final Fragment fragment = checkFragment(itemId); 
    final FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.content_frame, fragment); 
    ft.commit(); 
} 
+0

私が言ったように、私の最初の "解決策"は引き出しが閉じた後にフラグメントをロードすることでしたが、少し遅れてインターフェイスの流動性が失われました。とにかく助けてくれてありがとう –

関連する問題