2013-08-28 59 views
8

Tôi đã triển khai ngăn điều hướng và tôi muốn tải đoạn của mình trước khi ngăn điều hướng đóng. Hiện tại, các đoạn tải sẽ song song với ngăn đóng, vì vậy nếu mảnh bị nặng thì giao diện người dùng sẽ bị treo một chút.Tải mảnh vỡ trước khi ngăn điều hướng đóng

Mã tôi có là:

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); 
     } 
    } 

Làm thế nào tôi có thể thay đổi điều này vì vậy mà tôi thấy tải đoạn của tôi (ở chế độ nền) đầu tiên và khi nó đã tải xong, điều hướng ngăn kéo đóng?

Trả lời

3

Giải pháp của tôi là để tải đoạn SAU ngăn kéo đóng: thực sự gọi loadFragment phương pháp bên 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 có thể được sử dụng để theo dõi trạng thái và chuyển động của chế độ xem ngăn. Tránh thực hiện các thao tác tốn kém như bố cục trong khi hoạt ảnh vì nó có thể gây ra hiện tượng nói lắp; cố gắng thực hiện các hoạt động tốn kém trong trạng thái STATE_IDLE. Source.

Nói cách khác, Android khuyên bạn nên đợi ngăn kéo đóng trước khi hoán đổi Phân đoạn.

3

Cố gắng tải sau khi người ký phát bị đóng Sử dụng điều khiển để tạo ra một hành bị trì hoãn. Vì vậy, đó sẽ không có bất kỳ treo khi ngăn kéo đóng

Bên trong phương pháp onItemClick(), sử dụng mã dưới đây:

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 

// cách nào khác để làm việc đó là

tạo AsyncTask và trong phương thức doInBackground() bắt đầu giao dịch phân mảnh và đóng ngăn chứa trong onPostExecute()

+1

giải pháp trên là đúng, nhưng thay thế ft.commit() bằng ft.commitAllowingStateLoss(); bởi vì trạng thái phân mảnh của bạn sẽ bị thua lỗ trước khi đưa lên phía trước .. – Sivakumar