Подтвердить что ты не робот

Подход вложенных фрагментов Android

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

  • Основная активность, которая расширяет FragmentActivity  . Моя основная деятельность состоит из двух фрагментов
  • Список опций, который расширяет Фрагмент
  • Подробный список, который расширяет Фрагмент
  • Подробное описание, которое расширяет Фрагмент

Когда я запускаю свою основную деятельность. Он будет состоять из списка опций в Фрагмент 1 и списка сведений в Фрагмент 2. Затем я выбираю элемент из списка деталей. Затем его описание должно быть загружено в Фрагмент 2 основного действия

Смотреть это изображение

enter image description here

Я не понимаю, как это достичь. Я имею в виду, как я могу описать фрагмент списка деталей для загрузки фрагмента описания описания внутри основного действия. Также, когда я нажимаю кнопку "Назад", я должен вернуться к начальной стадии, т.е.

enter image description here

EDIT:

Что я сделал, так это создание интерфейсов (Listener) внутри фрагментов и их реализация в моей родительской деятельности. Но если есть 10 разных фрагментов, мне нужно реализовать все интерфейсы в моей родительской деятельности. Так есть ли другой подход к достижению этого?

4b9b3361

Ответ 1

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

  • Создайте класс фрагментов и объявите их в своем макете, как показано ниже.

    Здесь мы предполагаем, что мы создали фрагмент ArticleListFragment и ArticleReaderFragment.

    <fragment
        android:id="@+id/list"
        android:name="com.example.news.ArticleListFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1" />
    
    <fragment
        android:id="@+id/viewer"
        android:name="com.example.news.ArticleReaderFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2" />
    

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

  • Программное добавление фрагмента во время выполнения. В этом подходе вам нужно сначала объявить макет и обязательно добавить контейнер (LinearLayout, RelativeLayout и т.д.), Где вы поместите фрагмент. Например:

    <ListView
        android:id="@id/options_list"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1" >
    </ListView>
    
    <LinearLayout
        android:id="@id/detail_layout"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2"
        android:orientation="vertical" >
    </LinearLayout>
    

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

ExampleFragment fragment = new ExampleFragment();
getFragmentManager().beginTransaction().add(R.id.detail_layout, fragment).commit();

Чтобы заменить этот фрагмент на другой:

Fragment newFragment = new AnotherExampleFragment();
getFragmentManager().beginTransaction().replace(R.id.detail_layout, newFragment).addToBackStack(null).commit();

Обратите внимание на вызов addToBackStack. Это необходимо, так что, когда пользователь нажимает "Назад", будет отображаться предыдущий.

Я думаю, вы можете понять это здесь.:)

Ответ 2

В разделе "Фрагмент" вы можете использовать 2 контейнера (например, Linearayouts) - для левой навигации (список опций) и вашего правильного контента. Тогда вам нужна публичная функция, например public void switchFragmentInContainer(Fragment f, int position) в котором вы загружаете новый фрагмент в свой контейнер...

В вашем OptionList вы вызываете эту функцию как ((FragmentActivity) getActivity).switchFragmentInContainer(NEWFRAGMENT, FragmentActivity.RIGHT);.

Надеюсь, это то, что вы искали.

Ответ 3

Согласно http://developer.android.com/guide/components/fragments.html#Adding

// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();

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

// Commit the transaction
transaction.commit();

Вам также может понадобиться:

public class MainActivity extends FragmentActivity {
    ...
    public void onArticleSelected(Uri articleuri) {
        //use data to add the new fragment
    }
    ...
} 

public static class FragmentA extends ListFragment {
    OnArticleSelectedListener mListener;

    // Container Activity must implement this interface
    public interface OnArticleSelectedListener {
        public void onArticleSelected(Uri articleUri);
    }
    ...
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (OnArticleSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
        }
    }
    ...

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // Append the clicked item row ID with the content provider Uri
        Uri noteUri = ContentUris.withAppendedId(ArticleColumns.CONTENT_URI, id);
        // Send the event and Uri to the host activity
        mListener.onArticleSelected(noteUri);
    }
    ...
}