2012-08-31 17 views
11

Estoy tratando de cambiar el diseño de un fragmento durante el tiempo de ejecución bajo una condición particular.Establecer nuevo diseño en el fragmento

La disposición inicial de inflado dentro del onCreateView():

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

Entonces en algún momento posterior dentro del código fragmento me gustaría sustituir la disposición inicial con alguna otra disposición.

He intentado algunas cosas hasta ahora; este es el último que tengo:

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

¿Cómo puedo lograr esto?

Respuesta

8

No se puede reemplazar el diseño del fragmento una vez que se establece. Si necesita un diseño condicional, debe rediseñar su diseño y dividirlo en fragmentos aún más pequeños, o puede agrupar todos los elementos de diseño en contenedores secundarios (como LinearLayout), y luego colocarlos todos en RelativeLayout, posición para superponerse entre sí y cambiar visibilidad de estos LinearLayout s con setVisibility() cuando sea necesario.

4

Utilice un FragmentTransaction a través de la FragmentManger

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(); 
} 

El código para el YourFragment clase es sólo un LayoutInflater para que devuelva una vista

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

Esta es la sustitución de todo el fragmento. Solo deseo cambiar el diseño del fragmento actual. – Dacto

+0

Yo también, no tengo ninguna pista para eso http://stackoverflow.com/questions/28271827/fragment-changing-xml-layout-not-working –

+0

@Dacto Tienes que reemplazar el fragmento, no puedes cambiar el diseño de un fragmento de 'onAttach()' a 'onDetach()' – surfer190

4

sí, he hecho esto en modo siguiente. Cuando necesito establecer un nuevo diseño (xml), se debe ejecutar el siguiente fragmento de código.

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); 
    } 

Cada vez que necesito para cambiar el diseño que acabo de llamar al siguiente método

setViewLayout(R.id.new_layout); 
+0

Obteniendo 'android.view.InflateException' cuando intenta' setViewLayout (R.id.new_layout) ' – kamil09875

+0

¿Puedo ver el fragmento de código y el mensaje de error completo? ? –

+0

Este es exactamente su código y esta excepción no tiene ningún mensaje, Android a veces es extraño: D BTW. Utilicé otro método para cambiar el diseño en fragmentos – kamil09875

Cuestiones relacionadas