2016-12-13 54 views
0

我想要做的是實例化一個新的片段使用參數來設置在我的MainActivity類onCreateView內使用的值。Android片段實例化器不會運行之前onCreateView

片段類

//package 
//imports 

public class LansFragment extends Fragment { 

    private static final String ARG_TEXT = "arg_text"; 

    public LansFragment() { 
     super(); 
    } 

    public static LansFragment newInstance(String lan) { 

     LansFragment fragment = new LansFragment(); 
     Bundle args = new Bundle(); 
     args.putString(ARG_TEXT, lan); 
     fragment.setArguments(args); 

     return fragment; 
    } 

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

     View view = inflater.inflate(R.layout.fragment_lans, container, false); 
     Bundle args = getArguments(); 

     if (args != null) { 
      String lan = args.getString(ARG_TEXT); 
      //do things using params 
     } else { 
      //blank params 
      //should have been set when instantiated from MainActivity? 
     } 

     return view; 
    } 
} 

MainActivity類別

//package 
//imports 

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     String data = "Some string"; 
     LansFragment testfragment = LansFragment.newInstance(data); 
    } 

問題

有此刻的兩個問題。第一個問題是,如果我刪除: LansFragment testfragment = LansFragment.newInstance(data);然後這個片段仍然運行,這是由於在activity_main.xml內聲明片段?

其次,更重要的問題 - 當我實例類,並在傳遞參數,像我這樣的例子,他們從來沒有可用的內部onViewCreate,而是始終顯示爲null,是什麼原因造成這種情況?

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="app.stats.MainActivity" 
    android:orientation="horizontal"> 

    <fragment xmlns:android= 
     "http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:id="@+id/lans_fragment" 
     android:name="app.stats.LansFragment" 
     tools:layout="@layout/fragment_lans" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</LinearLayout> 

回答

2

當您在xml添加一個片段它與一個默認的構造函數創建。

LansFragment testfragment = LansFragment.newInstance(data);LansFragment testfragment = LansFragment.newInstance(data);創建一個新的片段,但它不會添加到您的佈局,也不影響在XML中定義的片段。

如果你想創建一個額外的參數的片段,你必須添加使用FragmentManager喜歡它:

getFragmentManager().beginTransaction() 
     .replace(R.layout.fragment_layout, testfragment).commit(); 

R.layout.fragment_layout是一個容器佈局在你的XML,通常FrameLayout裏,你的情況簡單地取代你<fragment ...有:

<FrameLayout 
     android:id="@+id/fragment_layout " 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

請注意,如果您的片段延伸android.support.v4.app.Fragment你應該更換getFragmentManager()getSupportFragmentManager()

+0

我是否必須使用'FrameLayout',因爲它更好,每個片段具有不同的xml文件以將代碼分離出來? – Dan

+0

'FrameLayout'只能作爲你的'fragment'的容器並進入你的'activity'佈局。 '片段'本身可以有你想要的任何父母佈局。 –

相關問題