2012-08-31 5 views
11

Ich versuche, das Layout eines Fragments während der Laufzeit unter einer bestimmten Bedingung zu ändern.Legen Sie neues Layout in Fragment

Das anfängliche Layout in innerhalb des onCreateView aufgeblasen():

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.cancel_video, null); 
    } 

irgendwann dann später im Codefragment Ich mag das erste Layout mit einem anderen Layout ersetzen.

Ich habe ein paar Dinge bis jetzt versucht; Dies ist das Neueste, das ich habe:

private void Something(){ 
    if(checkLicenseStatus(licenseStatus, statusMessage)){ 
       View vv = View.inflate(getActivity(), R.layout.play_video, null); 
       //more code 
    } 
} 

Wie kann ich das erreichen?

Antwort

8

Sie können das Layout des Fragments nicht ersetzen, nachdem es einmal festgelegt wurde. Wenn Sie ein bedingtes Layout benötigen, müssen Sie entweder Ihr Layout neu entwerfen und es in noch kleinere Fragmente aufteilen, oder Sie können alle Layoutelemente in Subcontainern gruppieren (wie LinearLayout), dann alle in RelativeLayout positionieren, einander überlappen und tauschen Sichtbarkeit dieser LinearLayout s mit setVisibility() bei Bedarf.

4

eine FragmentTransaction durch die FragmentManger Verwenden

FragmentManager fm = getFragmentManager(); 

if (fm != null) { 
    // Perform the FragmentTransaction to load in the list tab content. 
    // Using FragmentTransaction#replace will destroy any Fragments 
    // currently inside R.id.fragment_content and add the new Fragment 
    // in its place. 
    FragmentTransaction ft = fm.beginTransaction(); 
    ft.replace(R.id.fragment_content, new YourFragment()); 
    ft.commit(); 
} 

Der Code für die Klasse YourFragment nur LayoutInflater ist so, dass es eine

Ansicht kehrt
public class YourFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.your_fragment, container, false); 

     return view; 
    } 

} 
+4

Dies wird das gesamte Fragment zu ersetzen. Ich möchte nur das Layout des aktuellen Fragments ändern. – Dacto

+0

Ich auch, ich habe keine Ahnung dafür http://stackoverflow.com/questions/28271827/fragment-changing-xml-layout-not-working –

+0

@Dacto Sie müssen das Fragment ersetzen, können Sie nicht ändern das Layout eines Fragmentes von 'onAttach()' nach 'onDetach()' – surfer190

4

Ja, ich auf diese Weise in den folgenden getan haben. Wenn ich ein neues Layout (XML) festlegen muss, sollte das folgende Code-Snippet ausgeführt werden.

private View mainView; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup containerObject, Bundle savedInstanceState){ 
    super.onCreateView(inflater, containerObject, savedInstanceState); 

     mainView = inflater.inflate(R.layout.mylayout, null); 
     return mainView; 
    } 

    private void setViewLayout(int id){ 
    LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    mainView = inflater.inflate(id, null); 
    ViewGroup rootView = (ViewGroup) getView(); 
    rootView.removeAllViews(); 
    rootView.addView(mainView); 
    } 

Jedes Mal, wenn ich das Layout ändern müssen nenne ich nur die folgende Methode

setViewLayout(R.id.new_layout); 
+0

Getting 'android.view.InflateException' beim Versuch,' setViewLayout (R.id.new_layout) ' – kamil09875

+0

Kann ich Ihr Code-Snippet und volle Fehlermeldung sehen ? –

+0

Dies ist genau Ihr Code und diese Ausnahme hat keine Nachricht, Android ist manchmal seltsam: D BTW. Ich benutzte andere Methode, um das Layout in Fragmenten zu ändern – kamil09875