2011-12-08 12 views
7

¿Cómo implementar mostrar y ocultar fragmento dentro de fragmento en Android? He agregado dos fragmentos dentro de la actividad. Un fragmento que contiene un menú y un fragmento contiene un submenú. Tengo muchos botones en el fragmento del menú, como el hogar, la idea, etc. Si hago clic en el botón idea. Tengo que mostrar el submenú. Si vuelvo a hacer clic en el botón idea, tengo que ocultar el submenú. ¿Alguien puede dar un ejemplo o cómo acceder a un fragmento de vista en otro fragmento?Cómo implementar mostrar y ocultar fragmento dentro de fragmento en android

este es mi diseño principal

?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
<fragment class="com.gcm.fragment.CommonFragment" 
      android:id="@+id/the_frag" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" /> 
<fragment class="com.gcm.fragment.SubFragment" 
      android:id="@+id/the_frag1" 
      android:layout_marginTop="130dip" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" />    


</LinearLayout> 

En Mi fragmento

package com.gcm.fragment; 
import android.app.Fragment; 
import android.app.FragmentManager; 
import android.app.FragmentTransaction; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.View.OnClickListener; 
import android.widget.TextView; 

public class CommonFragment extends Fragment implements OnClickListener { 
    TextView txtIhaveIdea=null; 
    boolean menuVisible=false; 
    public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { 
     ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.collapsed_menu2, container, false); 

     txtIhaveIdea=(TextView)layout.findViewById(R.id.txtIhaveAnIdea); 
     txtIhaveIdea.setOnClickListener(this); 

     return layout; 
     } 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     if(!menuVisible) 
     { 
     FragmentManager fm = getFragmentManager(); 
     FragmentTransaction ft = fm.beginTransaction(); 
     fm.beginTransaction(); 
     Fragment fragOne = new SubFragment(); 
     ft.show(fragOne); 
     } 
     else 
     { 
      FragmentManager fm = getFragmentManager(); 
      FragmentTransaction ft = fm.beginTransaction(); 

      fm.beginTransaction(); 
      Fragment fragOne = new SubFragment(); 
      ft.hide(fragOne); 
     } 

    } 



} 

Gracias

+0

Consulte el código de referencia de fragmentos Ocultar/Mostrar dado en el sitio androide http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/FragmentHideShow.html – potter

+0

@kumar ¿Has logrado tu tarea? – AndroidOptimist

Respuesta

2

Simplemente, crear un método público en su actividad "padre". que oculta el fragmento.

Luego, desde el fragmento en su evento click, obtenga el "parent | ' actividad, fundido y luego llamar al método que ha creado.

((ParentActitity)getActivity()).hideFragment(); 
0

Es necesario utilizar una interfaz para comunicarse con la actividad de los padres.

echar un vistazo en el tutorial de Vogella, "3.4. la comunicación con la aplicación Fragmentos". Esta es la link

2

Usted podría intentar conseguir FrameLayout o fragmento de Identificación y cambiar su visibilidad

View frag = findViewById(R.id.my_fragment); 
frag.setVisibility(View.VISIBLE); 
5

Teniendo en cuenta esta cuestión ha 2K sobre .. una respuesta todavía puede ayudar a los nuevos lectores por lo aquí va:

  • que realmente no quiere tener FragmentManager y FragmentTransactions pasando fragmentos dentro de no tener ni yesos posibles referencias perjudiciales para su actividad (s)

Así que lo que hago y funciona bien se establece una interfaz con el fragmento y dar un método, dicen needsHide():

public class MyFrag extends Fragment { 

public interface MyFragInterface { 

    public void needsHide(); 
} 

luego implementar en su actividad:

public class MainActivity extends FragmentActivity implements MyFrag.MyFragInterface { 
public void needsHide() { 

FragmentManager fragmentManager = getSupportFragmentManager(); 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    //find the fragment by View or Tag 
    MyFrag myFrag = (MyFrag)fragmentManager.findFragmentByTag(SOME_TAG); 
    fragmentTransaction.hide(myFrag); 
    fragmentTransaction.commit(); 
     //do more if you must 
}} 

La única parte que requiere reflexión es cuándo invocar needsHide(), esto es lo que podría hacer en su Fragment onViewCreated, ya que está seguro de que no es demasiado pronto para que MainActivity confirme las transacciones. Si lo coloca onCreate() puede no funcionar dependiendo de lo que haces con fragmentos OTRO:

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 

    // Making sure Main activity implemented interface 
    try { 
     if (USE_A_CONDITION) { 
      ((MyFragInterface)this.getActivity()).needsHide(); 
     } 
    } catch (ClassCastException e) { 
     throw new ClassCastException("Calling activity must implement MyFragInterface"); 
    } 
    super.onViewCreated(view, savedInstanceState); 
} 
0

método hide(): Oculta un fragmento existente. Esto solo es relevante para los fragmentos cuyas vistas se han agregado a un contenedor, ya que esto hará que la vista se oculte.

su código:

@Override 
public void onClick(View v) { 
    if(!menuVisible) 
    { 
    FragmentManager fm = getFragmentManager(); 
    FragmentTransaction ft = fm.beginTransaction(); 
    fm.beginTransaction(); 
    Fragment fragOne = new SubFragment(); 
    ft.show(fragOne); 
    } 
    else 
    { 
     FragmentManager fm = getFragmentManager(); 
     FragmentTransaction ft = fm.beginTransaction(); 

     fm.beginTransaction(); 
     // it's wrong , you just hide the fragment that not added to FragmentTransaction 
     Fragment fragOne = new SubFragment(); 
     ft.hide(fragOne); 
    } 

} 
-3

A continuación el código que funcionó para mí ..

View frag = findViewById(R.id.fragment); 
frag.setVisibility(View.GONE);//Or View.INVISBLE 
Cuestiones relacionadas