java фрагментами Замена фрагментов не работает/Я выполняю это правильно?




передача данных между фрагментами android (4)

Мне потребовалось некоторое время, чтобы обернуть голову вокруг фрагментов, но это должен быть мой последний вопрос о фрагментах, так как я думаю, что я просто их уничтожаю. Я знаю, что это огромный беспорядок кода. Но я был бы признателен за помощь, чтобы убедиться, что я не нарушаю фундаментальные правила с фрагментами.

Я собираюсь опубликовать весь свой код, чтобы увидеть, может ли кто-нибудь «просмотреть его», чтобы увидеть, совершаю ли я какие-либо серьезные ошибки или я должен идти по более простому маршруту. Наконец, как указано в названии, мой фрагмент НЕ заменяется ... он будет добавлен сверху.

Дерево файлов:

MainActivity.java:

package com.example.learn.fragments;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;

public class MainActivity extends FragmentActivity{

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    /* Add a class to handle fragment */
    public static class SSFFragment extends Fragment {
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            View v = inflater.inflate(R.layout.choose_pill_frag, container,
                    false);
            return v;
        }
    }

    public void red(View view) {


        // Create new fragment and transaction
        ExampleFragments newFragment = new ExampleFragments();
        android.support.v4.app.FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

        // Replace whatever is in the fragment_container view with this fragment,
        // and add the transaction to the back stack
        transaction.replace(R.id.frag, newFragment);
        transaction.addToBackStack(null);

        // Commit the transaction
        transaction.commit();
    }

    public void blue(View view) {
        //Figure out code for "red" first
    }

}

ExampleFragments.java:

package com.example.learn.fragments;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class ExampleFragments extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.red_pill_frag, container, false);
    }
}

ActivityMain.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <fragment
        android:id="@+id/frag"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.example.learn.fragments.MainActivity$SSFFragment" />

</RelativeLayout>

choose_pill_frag.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageButton
        android:id="@+id/imageButton1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:onClick="blue"
        android:src="@drawable/blue" />

    <ImageButton
        android:id="@+id/imageButton2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:onClick="red"
        android:src="@drawable/red" />

</RelativeLayout>

red_pill_frag.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:text="You stay in Wonderland and I show you how deep the rabbit-hole goes."
        android:textAppearance="?android:attr/textAppearanceLarge" />

</RelativeLayout>

Приложение должно содержать две кнопки. Две кнопки существуют в одном фрагменте, а затем, если вы нажмете кнопку, фрагмент будет заменен новым фрагментом, который отобразит правильный текст. На данный момент он должен заменить, но, похоже, он добавляет его сверху.


Основное преимущество использования фрагментов заключается в том, чтобы заставить их обрабатывать части экрана, а не весь экран, что и делает деятельность.

Если вы просто создаете приложение для небольшого экрана, который будет функционировать как Activity, но закодирован во Фрагментах, просто сделайте отдельную FragmentActivity для каждого из ваших фрагментов.

Сделайте это onCreate вашего FragmentActivity:

public void onCreate(Bundle savedInstanceState) {
    setContentView(R.layout.emptylayout);

    FragmentManager fragmentManager = getSupportFragmentManager(); //Or getFragmentManager() if you're not using the support library
    FragmentTransaction fragmentTransaction = fragmentManager
            .beginTransaction();
    YourFragment fragment = new YourFragment();
    fragmentTransaction.add(R.id.emptyview, fragment);
    fragmentTransaction.commit();
}

Где layout / emptylayout - это файл макета XML с FrameLayout. id / emptyview - это FrameLayout.

Если вы хотите использовать XML для фактического макета вашего фрагмента, сделайте отдельный XML-макет для фактического фрагмента и раздуйте его в «onCreateView» фрагмента:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.files, container, false);
            // Do stuff here
    return view;
}

Затем просто используйте startActivity(new Intent(getActivity(), YourFragmentActivity.class)) чтобы запустить FragmentActivity из фрагмента.

Кажется излишним, да, но если позже вы планируете более крупные экраны (если нет, то почему вы беспокоитесь о фрагментах?), Это упростит в долгосрочной перспективе.


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

 protected class MyTabsListener1 implements ActionBar.TabListener{
        private Fragment frag ;
        public MyTabsListener1 ( Fragment frag){
            this.frag = frag;
        }

        @Override
        public void onTabReselected(Tab tab, FragmentTransaction ft) {
            //  TODO Auto-generated method stub

        }

        @Override
        public void onTabSelected(Tab tab, FragmentTransaction ft) {

                switch (tab.getPosition()){
                case 0:

                        ft.replace(R.id.replace, homeFrag);
                    break;

                case 1:
                    ft.replace(R.id.replace, createFrag);
                        break;

                case 2:
                    ft.replace(R.id.replace, ioListFrag);
                    break;
                case 3:

                    ft.replace(R.id.replace, settingFrag);

                    break;      


                default: 


                    break;

                }

            }

и мой основной макет таков:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <LinearLayout
        android:id="@+id/replace"
        android:layout_width="wrap_content"
        android:layout_height="match_parent" >
    </LinearLayout>

</LinearLayout>

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

Fragment details = (Fragment)getSupportFragmentManager().findFragmentById(R.id.details);
details = new ExamplesFragment();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.details, details);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();

Кроме того, часть android.support.v4.app просто не нужна, и, откровенно говоря, приводит к возможным часам попыток типа «спуститься по неправильной дороге», добавляя и удаляя ее по всему вашему коду (если вы используете: )

import android.support.v4.app.FragmentTransaction;

В этом примере вам не нужно импортировать поддержку FragmentManager. Однако, если вы получаете ошибки, убедитесь, что вы сами импортировали библиотеку в свою папку «libs».

Это решение исправит проблему перекрывающегося фрагмента и, надеюсь, сэкономит время, затрачиваемое на замену фрагментов.


Короче говоря, вы НЕ МОЖЕТЕ заменить фрагмент, если u определил его в XML с тегом фрагмента. Вместо этого, как @pawelzieba советовал добавить фрейм-тег в свой макет, найти его и добавить, удалить, заменить фрагменты там .. Надеюсь, это помогло. ура





android-fragments