2016-03-01 41 views
1

我試圖建立一個NavigationView一個活動,並儘可能多的片段作爲導航項目:竊聽 第一項 - >第一片段把隨機的遠程圖像; 第二項/第三項挖掘 - >其他片段加載。 我的目標是,在切換回第一項時,顯示已下載的圖像,而不是獲取新圖像。的片段總是空savedInstanceState在運行時(導航視圖)內置

activity_main.xml中

<android.support.v4.widget.DrawerLayout 
(.....) 
android:id="@+id/drawer_layout"> 

<!-- This LinearLayout represents the contents of the screen --> 
<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <!-- The ActionBar displayed at the top --> 
    <include 
     layout="@layout/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

    <!-- The main content view where fragments are loaded --> 
    <FrameLayout 
     (......) 
     android:id="@+id/flContent"/> 
</LinearLayout> 

<!-- The navigation drawer that comes from the left --> 
<android.support.design.widget.NavigationView 
    (.......) 
    android:id="@+id/nvView" /> 

MainActivity

public class MainActivity extends AppCompatActivity { 

Fragment homeFragment; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    //...... 
    setupDrawerContent(nvDrawer); 
    if (findViewById(R.id.flContent) != null && savedInstanceState == null) { 
     homeFragment = new HomeFragment(); 
     getSupportFragmentManager().beginTransaction().add(R.id.flContent, homeFragment, "homeFragment").commit(); 
    } 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    getSupportFragmentManager().putFragment(outState, "homeFragment", homeFragment); 
} 

private void setupDrawerContent(NavigationView navigationView) { 
    navigationView.setNavigationItemSelectedListener(
      new NavigationView.OnNavigationItemSelectedListener() { 
       @Override 
       public boolean onNavigationItemSelected(MenuItem menuItem) { 
        selectDrawerItem(menuItem); 
        return true; 
       } 
      } 
    ); 
} 

public void selectDrawerItem(MenuItem menuItem) { 
    // Create a new fragment and specify the item to show based on 
    // position 
    Fragment fragment = null; 

    Class fragmentClass = null; 
    switch(menuItem.getItemId()) { 
     case R.id.nav_first_fragment: 
      fragmentClass = HomeFragment.class; 
      break; 
     case R.id.nav_second_fragment: 
      fragmentClass = SecondFragment.class; 
      break; 
     default: 
      fragmentClass = HomeFragment.class; 
    } 
    try { 
     fragment = (Fragment) fragmentClass.newInstance(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    // Insert the fragment by replacing any existing fragment 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit(); 

    // Highlight the selected item, update the title, and close the drawer 
    menuItem.setChecked(true); 
    setTitle(menuItem.getTitle()); 
    mDrawer.closeDrawers(); 
    } 
} 

HomeFragment

public class HomeFragment extends Fragment { 


    private static final String TAG = "HomeFragment"; 

    public HomeFragment() { 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     super.onCreateView(inflater, container, savedInstanceState); 
     // ...... 
     View fragmentView = inflater.inflate(R.layout.home_fragment, container, false); 
     if (savedInstanceState == null) { 
      // FETCH RANDOM IMAGE 
     }else { 
      // RESTORE IT (but always null) 
     } 
     return fragmentView; 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putSerializable(/*SOME DATA*/); 
    } 

    @Override 
    public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     if (savedInstanceState != null) { 
      // ALWAYS NULL 
     } 
    } 
} 

我發現this的答案,但我不知道如何這樣做,因爲我只是有一個FrameLayout的參考。

跟蹤生命週期方法我注意到MainActivity總是處於活動狀態,所以它從不調用onSaveInstanceState,我不知道如何在我的HomeFragment中使用Bundle來恢復onCreateView中的savedInstanceState。 你有什麼提示分享? 非常感謝

回答

0

當你用另一個片段替換一個片段時,前一個片段(被替換)被銷燬,它的非靜態成員變量中的任何數據都會丟失。

如果你想保留圖像的片段,您可以使用位圖緩存來存儲您的圖像,但如果你加載相同的形象,爲您的片段只會工作。如果要加載的隨機圖像,並希望您實例相同的片段,下一次加載相同的圖像(所以你希望你的家庭片段總是加載它加載的第一次被實例化相同的圖像),那麼你需要持久化數據。有幾種方法可以做到這一點,你可以使用一個靜態變量在您的主頁片段舉行的URL的圖像,你可以將其存儲在SharedPreferences,你可以把它的活動,這樣的活動將其傳遞迴重新創建時的主頁片段,等等。選擇最適合您需求的解決方案。

+0

感謝您的幫助! 因爲我紅了大量的討論強調束舞蹈的重要性,我是「肯定」,在這樣... 你給了我寶貴的解決方案,我一定會詳細探討,我真的很感激了! – Alekxs