2015-11-02 39 views
0

我已經使用android web上的代碼示例創建了選項卡視圖。 http://developer.android.com/training/implementing-navigation/lateral.htmlAndroid片段活動初始化變量爲空值

我已經添加了此代碼來調用將設置標題的setTitle方法。

mViewPager.addOnPageChangeListener(
      new ViewPager.SimpleOnPageChangeListener() { 
       @Override 
       public void onPageSelected(int position) { 
        actionBar.setSelectedNavigationItem(position); 

        FragmentInterface f = (FragmentInterface) mSectionsPagerAdapter 
          .getItem(position); 
        f.setTitle(); 
       } 
      }); 

在我的片段類,我已經定義爲的setTitle

@Override 
public void setTitle() {  
    System.out.println("Title " + cellMain); 
    if (cellMain != null) { 
     getActivity().getActionBar() 
       .setTitle(cellMain.cellData.getIPWithPort()); 
    } 
} 

,我也有一個按鈕,它的作用:

public void connect(View view) { 
    System.out.println("Connect " + cellMain); 

    if (cellMain == null) { 
     cellMain = CellMain.createAndroid(this, 
       getActivity().getFilesDir().toString()); 

     getActivity().getActionBar() 
       .setTitle(cellMain.cellData.getIPWithPort()); 
    } 

首先我點擊它調用連接按鈕, 它打印出「Connect null」,因爲它沒有被初始化。

再次按下按鈕會打印出「Connect cell.CellMain @ ....」。

現在我通過選擇另一個選項卡並切換回相同的選項卡來更改視圖。

的setTitle()方法打印出「標題空」這是不期望作爲cellMain被初始化。按下按鈕仍然打印出「連接cell.CellMain @ ......」

爲什麼我的方法的setTitle給出了我的變量一個空值?

回答

1

猜測這是由於ViewPager中的碎片生命週期造成的。

ViewPager有一個活動頁面的限制,它們是當前頁面和更接近片段的頁面(例如:如果限制爲3,您將激活當前顯示的片段,下一個和先前)。其餘的將通過onPause()方法。

恢復片段時會發生同樣的情況。當您將片段放在前面時,該片段中不活動的片段將通過onResume方法。

根據您擁有的片段數量,您可以考慮採用不同的解決方案。

如果有兩個或三個片段,改變viewPager的offsetLimit包含所有的人。

viewPager.setOffscreenPageLimit(3); 

如果您有更多的片段,想想拯救它是在的onPause()方法的狀態,並恢復它的每個片段的onResume()。

+0

我已經只有2頁雖然。我已經厭倦了將pagelimit設置爲2.它仍然返回null。我厭倦了重載onPause方法,但它永遠不會調用一次。 – Tim

1

我注意到mSectionsPagerAdapter.getItem(位置)返回導致變量始終是空的片段的新實例。

我已經手動實例化構造函數中的每個片段並相應地返回它們。

public class SectionsPagerAdapter extends FragmentPagerAdapter { 

    String[] classes; 
    Fragment[] fragments; 
    public SectionsPagerAdapter(FragmentManager fm) { 
     super(fm); 
     classes = new String[]{CellView.class.getName(), 
       ControlPanelView.class.getName()}; 
     fragments = new Fragment[classes.length]; 
     for (int i = 0; i < classes.length; i++) { 
      fragments[i] = Fragment.instantiate(context, classes[i]); 
     } 
    } 

    @Override 
    public Fragment getItem(int position) { 
     //Used to be this line 
     //return Fragment.instantiate(context, classes[i]) 
     return fragments[position]; 
    }