0

我想知道爲什麼它需要putInt進入捆綁。當我滑動到其他選項卡,我的片段是否重新創建,或者是最後創建的?爲什麼在這裏使用了空白的構造函數?關於片段創建

public class SectionsPagerAdapter extends FragmentPagerAdapter { 

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

    @Override 
    public Fragment getItem(int position) { 

     switch (position) { 
      case 0 : return fragment_zg.newInstance(position + 1); 
      case 1: return fragment_Uni.newInstance(position+1); 
      default: return fragment_zg.newInstance(position + 1); 
    } 
} 

這裏是我的Fragment

public class fragment_Uni extends Fragment { 
    private static final String ARG_SECTION_NUMBER = "section_number"; 
    public fragment_Uni() {} 

    public static fragment_Uni newInstance(int sectionNumber) { 
     fragment_Uni uni_fragment = new fragment_Uni(); 
     Bundle args = new Bundle(); 
     args.putInt(ARG_SECTION_NUMBER, sectionNumber); 
     uni_fragment.setArguments(args); 
     return uni_fragment; 
    } 
} 
+0

你在詢問哪個參數? –

+0

對不起,Bundle args = new Bundle(); args.putInt(ARG_SECTION_NUMBER,sectionNumber); uni_fragment.setArguments(args); – Zayar

+0

如果你不這樣做,沒有必要使用參數。對於設備方向更改,您必須爲片段管理器提供一個空/空構造函數。不管你是否改變了方向。 –

回答

0

我想知道爲什麼它需要放入捆綁。

如果你想傳遞一些值到Fragment,那麼你需要使用Bundle然後將其設置爲論據,Fragment。否則,參數不會保留在Fragment娛樂中。如果您的Fragment不需要參數或者它不是必需的,那麼可以省略Bundle

當我滑動到其他標籤,我的片段被重新創建或使用最後 創建?

它將使用最後創建的,但如果要更新,則必須刷新頁面適配器,否則數據將不會更新。

爲什麼在這裏使用了空構造函數?

這是Fragment所需的默認構造函數。

+0

這是我的最佳答案!謝謝!!! – Zayar

+0

這是我的榮幸 – ViramP

-1

這是因爲方式的片段在Android系統的重建。當Android重新創建片段時,它使用反射(Java反射API)重建它們,因此它假定構造函數沒有參數(因爲其他方式不知道如何使用它)。那麼爲什麼需要片段參數呢?參數存儲在一個Bundle對象中,Android知道如何重新創建,所以這就是爲什麼它使用Bundle的原因,Android只是簡單地將參數bundle傳遞給您的片段,並且您的片段使用存儲的值重新創建自己。

+0

@Downvoter我想知道你爲什麼低估了我的答案。用戶詢問了關於非參數構造函數和Bundle的原因,所以我不知道爲什麼downvote。 – josemgu91

+0

setArgument(bundle)恢復我上一次創建的片段值?? – Zayar

+0

不完全。當您將數據存儲在片段參數集中時,那麼當Android恢復您的片段時,它將再次傳遞參數集,因此您的最後值將會出現在那裏(例如,當您按Home按鈕並且Android將您的應用放入緩存時)。這是因爲Android知道如何存儲和恢復Bundle對象,所以這就是使用Bundle的原因。 – josemgu91

0

A Fragment始終需要一個默認的構造函數,但不能有任何其他構造函數。這就是爲什麼我們使用靜態方法創建實例並將參數傳遞給它。

其原因是保留實例並將數據輕鬆保存爲一個包。

有關更多說明,請參閱this question

編輯: 要回答你其他問題,在這種情況下,每次刷卡時都會創建一個新的Fragment。如果你想保留這些碎片,你應該使Fragment成爲一個Singleton。