it-swarm.com.ru

Android заменяет текущий фрагмент другим фрагментом

Я только начал с дизайна фрагмента для HoneyComb. Я создал два фрагмента. Когда я нажимаю кнопку в левой части фрагмента, в правой части создается новый фрагмент. Между тем, когда я нажимаю кнопку в правом фрагменте (т.е. DetialsFragment в моем коде ниже должен быть заменен другим фрагментом . Main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="horizontal" >
    <fragment class="com.fragment.example.Titles"
        Android:id="@+id/titles" Android:layout_weight="1"
        Android:layout_width="0px"
        Android:layout_height="match_parent" />
    <FrameLayout Android:id="@+id/details" Android:layout_weight="1"
        Android:layout_width="0px"
        Android:layout_height="match_parent" />

</LinearLayout>

FragmentExample.Java

public class FragmentExample extends Activity {
/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

Titles.Java

public class Titles extends Fragment {
    public FragmentTransaction ft;
    @Override
    public View onCreateView(LayoutInflater inflater,
        ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.main1, null);
        Button button1 = (Button)v.findViewById(R.id.button1);
        button1.setText("santhosh");
        button1.setOnClickListener(new OnClickListener() {



            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                 DetailsFragment details = (DetailsFragment)
                            getFragmentManager().findFragmentById(R.id.details);
                    if (details == null || details.getShownIndex() != 1) {
                        // Make new fragment to show this selection.
                        details = DetailsFragment.newInstance(1);

                        // Execute a transaction, replacing any existing
                        // fragment with this one inside the frame.
                        ft
                                = getFragmentManager().beginTransaction();
                        ft.add(R.id.details, details, "detail");
                        ft.setTransition(
                                FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                        ft.commit();
                    }
            }

        });
        return v;
    }
}

DetailsFragment.Java

public class DetailsFragment extends Fragment {
    /**
     * Create a new instance of DetailsFragment, initialized to
     * show the text at 'index'.
     */
    Titles title = new Titles();
    String[] titles = {"Title1", "Title2", "Title3", "Title4"};
    public static DetailsFragment newInstance(int index) {
        DetailsFragment f = new DetailsFragment();

        // Supply index input as an argument.
        Bundle args = new Bundle();
        args.putInt("index", index);
        f.setArguments(args);

        return f;
    }

    public int getShownIndex() {
        return getArguments().getInt("index", 0);
    }

    @Override
    public View onCreateView(LayoutInflater inflater,
        ViewGroup container, Bundle savedInstanceState) {
        if (container == null) {
            // Currently in a layout without a container, so no
            // reason to create our view.
            return null;
        }
        Button button = new Button(getActivity());
        button.setText("Next");
        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
            }
        });
        return button;
    }
}
42
Santhosh_pulliman

Затем, при условии, что ваша кнопка отображается, и событие click запускается, вы можете вызвать следующее в вашем событии click:

final FragmentTransaction ft = getFragmentManager().beginTransaction(); 
ft.replace(R.id.details, new NewFragmentToReplace(), "NewFragmentTag"); 
ft.commit(); 

и если вы хотите вернуться к DetailsFragment при нажатии, убедитесь, что вы добавили вышеупомянутую транзакцию в задний стек, т.е. 

ft.addToBackStack(null);

Или я что-то упустил? В качестве альтернативы некоторые люди предполагают, что ваша активность получает событие нажатия кнопки, и она несет ответственность за замену фрагментов на панели сведений.

88
PJL

Вы можете попробовать ниже код. это очень простой метод для Push нового фрагмента из старого фрагмента.

private int mContainerId;
private FragmentTransaction fragmentTransaction;
private FragmentManager fragmentManager;
private final static String TAG = "DashBoardActivity";

public void replaceFragment(Fragment fragment, String TAG) {

    try {
        fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(mContainerId, fragment, tag);
        fragmentTransaction.addToBackStack(tag);
        fragmentTransaction.commitAllowingStateLoss();

    } catch (Exception e) {
        // TODO: handle exception
    }

}
1
Jignesh Goyani

Используйте Android.support.v4.app для FragmentManager & FragmentTransaction в вашем коде, это сработало для меня.

DetailsFragment detailsFragment = new DetailsFragment();
Android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
Android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.details,detailsFragment);
fragmentTransaction.commit();
1
Madhu Jayarama

это очень просто, как заменить на фрагмент.

DataFromDb changeActivity = new DataFromDb();
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.changeFrg, changeActivity);
    transaction.commit();
0
Alan