Переключение между фрагментами - PullRequest
34 голосов
/ 17 октября 2011

Стандартный способ объявления фрагментов в файле макета xml -

<LinearLayout ...> 
    <fragment class="com.example.SomeFragment"
</LinearLayout>

где SomeFragment - это класс Java, определенный как

class SomeFragment extends Fragment { 
    ... 
}

Допустим, у меня есть 3 фрагмента; фрагмент1, фрагмент2 и фрагмент3. Когда пользователь запускает приложение, я показываю им фрагмент1, а когда они нажимают на кнопку, я заменяю фрагмент1 фрагментом2 и т. Д.

Как лучше всего определить 3 фрагмента в одном XML-файле макета?

Ответы [ 2 ]

57 голосов
/ 17 октября 2011

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

<FrameLayout 
    android:id="@+id/contentFragment"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_weight="1" />

и чем вы можетеустановите фрагмент в коде так:

Fragment fragment = new YourFragment();

FragmentManager fm = getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
transaction.replace(R.id.contentFragment, fragment);
transaction.commit();
18 голосов
/ 07 сентября 2012

Я приведу пример переключения между двумя макетами во фрагментах:

Сначала объявите макет с двумя фрагментами: (это зависит от того, сколько фрагментов вы хотите в своем макете)

gment_layout_example.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

     <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="0dip"
        android:layout_height="match_parent"
        android:layout_weight="1" />

    <fragment
        android:id="@+id/Fragment2"
        android:layout_width="0dip"
        android:layout_height="match_parent"
        android:layout_weight="1"
        class="com.example.SecondFragment" >

        <!-- Preview: layout=@layout/details -->
    </fragment>
</LinearLayout>

Над макетом будут отображаться два фрагмента Fragment1 и Fragment2.Для Fragment1 я объявил контейнер, так как содержимое контейнера будет изменяться во время выполнения.Так что не объявлен класс Fragment здесь.подробнее об этой проверке

http://developer.android.com/training/basics/fragments/fragment-ui.html

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

  public class FragmentExampleActivity extends FragmentActivity{

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

     // Check that the activity is using the layout version with
    // the fragment_container FrameLayout
    if (findViewById(R.id.fragment_container) != null) {

        // However, if we're being restored from a previous state,
        // then we don't need to do anything and should return or else
        // we could end up with overlapping fragments.
        if (savedInstanceState != null) {
            return;
        }

        // Create an instance of Fragment1
        Fragment1 firstFragment = new Fragment1();

        // In case this activity was started with special instructions from an Intent,
        // pass the Intent's extras to the fragment as arguments
        firstFragment.setArguments(getIntent().getExtras());

        // Add the fragment to the 'fragment_container' FrameLayout
        getSupportFragmentManager().beginTransaction()
                .add(R.id.fragment_container, firstFragment).commit();
    }
  }

 }

. Чтобы создать макет для двух фрагментов, создайте два класса, расширяющих Fragment

public class Fagment1 extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    //set the layout you want to display in First Fragment
    View view = inflater.inflate(R.layout.fragment1,
            container, false);
    return view;

}

}

Таким же образомсоздайте класс Fragment для второго Fragment и установите макет

Теперь. Если вы хотите переключить макет фрагмента в Fragment1 на другой макет одним нажатием кнопки, то создайте другой класс, скажем, Fragment3.java, и установите макет, который вы хотитепереключитесь и напишите приведенный ниже код внутри Fragment1.java

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    Button showFragment3=(Button)getView().findViewById(R.id.Button1);
    showFragment3.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            FragmentManager fragmentManager = getFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager
                    .beginTransaction();

            Fragment3 fragment3 = new Fragment3();
            fragmentTransaction.replace(R.id.Fragment1, fragment3);
//provide the fragment ID of your first fragment which you have given in
//fragment_layout_example.xml file in place of first argument
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();

        }
    });

}

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

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    Button showFragment1 = (Button) getView().findViewById(
            R.id.Button2);
    showFragment1 .setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            getFragmentManager().popBackStack();
        }
    });

}

Спасибо!Надеюсь, это поможет вам ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...