Как реализовать показать и скрыть фрагмент внутри фрагмента в Android - PullRequest
8 голосов
/ 08 декабря 2011

Как реализовать отображение и скрытие фрагмента внутри фрагмента в Android? Я добавил два фрагмента внутри активности. Один фрагмент содержит меню и один фрагмент содержит подменю. У меня есть много кнопок во фрагменте меню, таких как дом, идея и т. Д. Если я нажимаю кнопку идеи. Я должен показать подменю. Если я снова нажму кнопку «идея», мне придется скрыть подменю. Кто-нибудь может привести пример, или как получить доступ к одному фрагменту представления в другом фрагменте?

это мой макет main

?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>

В моем фрагменте

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

    } 



}

Спасибо

Ответы [ 6 ]

5 голосов
/ 16 мая 2013

Учитывая, что этот вопрос имеет более 2 КБ. Ответ может все еще помочь новым читателям, поэтому здесь он идет:

  • Вы действительно не хотите, чтобы FragmentManager и FragmentTransactions происходили внутри фрагментов, чтобы не иметь броскии потенциальные вредные ссылки на ваши действия

Итак, что я делаю и отлично работаю, так это установил интерфейс для фрагмента и дал метод, скажем needsHide ():

public class MyFrag extends Fragment {

public interface MyFragInterface {

    public void needsHide();
}

Затем реализуйте это в своей Деятельности:

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

Единственная часть, которая требует обдумывания, - это когда нужно вызвать needsHide (), это вы можете сделать в onViewCreated вашего Фрагмента, поскольку вы уверены, что это не слишкомрано для вашей MainActivity совершать транзакции.Если вы поместите его в функцию Create (), он может не работать в зависимости от того, что вы делаете с другими фрагментами:

 @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);
}
4 голосов
/ 15 марта 2013

Вы можете попробовать получить framelayout или фрагмент по id и изменить его видимость

View frag = findViewById(R.id.my_fragment);
frag.setVisibility(View.VISIBLE);
2 голосов
/ 26 февраля 2013

Просто создайте публичный метод в своей «родительской» деятельности. который скрывает фрагмент.

Тогда изнутри фрагмента в вашем событии click получим «parent |» действие, приведите его и затем вызовите метод, который вы создали.

    ((ParentActitity)getActivity()).hideFragment();
1 голос
/ 01 марта 2016

method hide(): Скрывает существующий фрагмент.Это относится только к фрагментам, чьи представления были добавлены в контейнер, так как это приведет к скрытию представления.

ваш код:

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

} 
1 голос
/ 26 февраля 2013

Вам необходимо использовать интерфейс для связи с родительским действием.

Взгляните на учебник Фогеллы "3.4. Связь приложения с фрагментами". Вот ссылка

0 голосов
/ 01 мая 2016

Ниже код работал для меня ..

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