2015-11-21 85 views
2

你好樣的(機器人)的程序員,處理屏幕旋轉的片段視圖(州)PagerAdapter內內片段

的情況如下:

我有一個使用NavigationDrawer的活動,允許加載3個片段。在其中的一個片段中,我有一個ViewStatePagerAdapter,它將轉而承載3個片段。在其中一個片段中,我使用cursorloader加載了一堆數據庫。這些值可以編輯爲一個新值,但在點擊某個按鈕之前不應將其保存到數據庫。

所有這些工作正常,但問題是,當我現在旋轉屏幕,所有更改的數據都消失了。我嘗試在內部片段本身中使用onSaveInstance,但我認爲問題在於更高,因爲我已經注意到比旋轉屏幕時ViewPager跳回第一個選項卡。

什麼是正確的方式(/正確的位置:活動中,某些片段,...)來:

  1. 確保viewpager保持正確的選項卡
  2. 上記得在更改的數據內片段

包含viewpager目前該片段具有下列onCreateView:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View v = inflater.inflate(R.layout.fragment_home, null); 
    tabLayout = (TabLayout) v.findViewById(R.id.fragment_tabs); 
    viewPager = (ViewPager) v.findViewById(R.id.fragment_viewpager); 
    viewPager.setOffscreenPageLimit(3); 

    viewPager.setAdapter(new MyAdapter(getChildFragmentManager())); 
    tabLayout.setupWithViewPager(viewPager); 

    return v; 
} 

併爲FragmentStatePagerAdapter

class MyAdapter extends FragmentStatePagerAdapter { 

    public MyAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    /** 
    * Return fragment with respect to Position . 
    */ 
    @Override 
    public Fragment getItem(int position) 
    { 
     switch (position){ 
      case 0 : return PersonFragment.newInstance(); 
      case 1 : return FriendsFragment.newInstance(); 
      case 2 : return EventsFragment.newInstance(); 
     } 
     return null; 
    } 

    @Override 
    public int getCount() { 
     return int_items; 
    } 

    /** 
    * This method returns the title of the tab according to the position. 
    */ 
    @Override 
    public CharSequence getPageTitle(int position) { 

     switch (position){ 
      case 0 : 
       return "ME"; 
      case 1 : 
       return "FOLLOWING"; 
      case 2 : 
       return "EVENTS"; 
     } 
     return null; 
    } 
} 

沒有什麼特別的事情發生在這裏休息的內部類。 (這也許應該?)

的片段viewpager內部已經按照預先的onCreate/onCreateView

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    View rootView = inflater.inflate(R.layout.fragment_person, container, false); 
    this.viewHolder = new ViewHolder(rootView); 

    if (savedInstanceState != null) { 
     CharSequence savedPersonName = savedInstanceState.getCharSequence("personName"); 
     if (savedPersonName != null) { 
      Log.v("PersonFragment", savedPersonName.toString()); 
      this.viewHolder.personnameView.setText(savedPersonName); 
     } 
    } 

    return rootView; 
} 

感謝。

+0

後一些代碼的東西。你的viewpager在創建什麼?它是獲取現有片段的一個實例,還是完全創建一個新的片段?什麼是你的onCreate的片段。 – QuantumTiger

+0

@QuantumTiger 即將推出,已經添加了一個部分,也添加了更多。 – CounterFlame

+0

你在哪裏重新加載savedinstancestate – QuantumTiger

回答

1

你可能已經知道了,但是這是什麼樣的,我會做解決您的第二個問題

private TextView tvTitle; 

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) { 
    rootView = inflater.inflate(R.layout.mylayout, container, false); 

    tvTitle = (TextView) rootView.findViewById(R.id.mytitle); 

    if (savedInstanceState != null) { 
     CharSequence csTitle = savedInstanceState.getCharSequence("myTitle"); 
     if (csTitle != null) tvTitle.setText(csTitle); 
    } 
} 

public void onSaveInstanceState(Bundle outState) { 
super.onSaveInstanceState(outState); 

outState.putCharSequence("myTitle", tvTitle.getText()); 
} 
+0

所以我做了這個,甚至把值發送到logcat,並在那裏顯示正確的值。在同樣的if語句中,我使用setText,但在GUI中看不到它發生了變化。 我更新了現在在我的原始文章中使用的onCreateView,所以您可以看到。 – CounterFlame

+0

所以它看起來像被查看的片段是與寫入logcat的片段不同的實例。上面Nguyen的回答有幫助嗎? – QuantumTiger

+0

我想我修復了它,但我暫時刪除了一些東西,所以一些錯誤可能會再次出現。 似乎問題是,在我的mainActivity中,我每次都做了一個新的HomeFragment,而不是首先檢查是否存在一個(通過使用findFragmentByTag)。我想這讓所有的孩子都消失了,包括ViewPager和那個裏面的片段。 感謝您抽出時間幫助我,非常感謝。 – CounterFlame