Замена фрагмента на вкладке, изменение всех вкладок

EDIT Я отредактировал предыдущий вопрос, который я решил. Большое спасибо за ответы.

У меня есть графический интерфейс с 3 вкладками (Новости, Стратегия и История), в одной из них (Новости) я загружаю ExpandableListView, и когда пользователь щелкает один из элементов из списка, он загружает другой фрагмент, содержащий сведения о выбранном элементе. . Мне удалось заменить фрагмент на этой вкладке другим фрагментом, используя этот код:

    CategoryTab categories = new CategoryTab();//Fragment 2
    FragmentManager manager = activity.getFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.replace(this.getId(), categories, "News");
    //transaction.replace(android.R.id.content, categories, "News");
    transaction.addToBackStack(null);
    transaction.commit();

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

public static class TabListener<T extends Fragment> implements ActionBar.TabListener {
    private final Activity mActivity;
    private final String mTag;
    private final Class<T> mClass;
    private final Bundle mArgs;
    private Fragment mFragment;

    public TabListener(Activity activity, String tag, Class<T> clz) {
        this(activity, tag, clz, null);
    }

    public TabListener(Activity activity, String tag, Class<T> clz, Bundle args) {
        mActivity = activity;
        mTag = tag;
        mClass = clz;
        mArgs = args;

        // Check to see if we already have a fragment for this tab, probably
        // from a previously saved state.  If so, deactivate it, because our
        // initial state is that a tab isn't shown.
        mFragment = mActivity.getFragmentManager().findFragmentByTag(mTag);
        if (mFragment != null && !mFragment.isDetached()) {
            FragmentTransaction ft = mActivity.getFragmentManager().beginTransaction();
            ft.detach(mFragment);
            ft.commit();
        }
    }

    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        if (mFragment == null) {
            mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs);
            ft.add(android.R.id.content, mFragment, mTag);
        } else {
            ft.attach(mFragment);
        }
    }

    public void onTabUnselected(Tab tab, FragmentTransaction ft) {          
        if (mFragment != null) {
            ft.detach(mFragment);
        }
    }

    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        Toast.makeText(mActivity, "Reselected!", Toast.LENGTH_SHORT).show();
    }
}

Мой вопрос: почему на всех вкладках после замены отображается один и тот же фрагмент? и как я могу смоделировать кнопку «Назад» со значком, представленным на панели действий, чтобы снова загрузить фрагмент 1 на вкладке «Новости»?

Любая помощь будет оценена

ПД: извините за мой английский


person Juan Ospina    schedule 28.01.2013    source источник
comment
Попробуйте везде заменить getActivity().getApplicationContext() на getActivity(), например, при настройке IssueAdapter.   -  person CommonsWare    schedule 28.01.2013
comment
Вы всегда можете проверить, не возвращает ли getActivity() значение null, вызвав метод isAdded() во фрагменте.   -  person Tobrun    schedule 28.01.2013
comment
Я нашел ошибку, я создавал новый объект NewsTab где-то в своем коде, поэтому getActivity возвращает null, спасибо всем за помощь.   -  person Juan Ospina    schedule 28.01.2013


Ответы (1)


Убедитесь, что вы вызываете getActivity() в или после onActivityCreated, как и раньше, тогда он вернет значение null.

Фрагмент будет присоединен к нулевому действию до тех пор, пока onActivityCreated... то есть, если вы вызовете getActivity() в onCreate или onCreateView, он вернет значение null, поскольку действие еще не создано. Поэтому убедитесь, что у вас есть все ваши вызовы getActivity() в или после onActivityCreated.

person Gabriele Mariotti    schedule 28.01.2013
comment
Спасибо за ваш быстрый ответ, я сделаю это и прокомментирую, если это сработает. - person Juan Ospina; 28.01.2013
comment
Я нашел ошибку, я создавал новый объект NewsTab где-то в своем коде, поэтому getActivity возвращает null, спасибо всем за помощь. - person Juan Ospina; 28.01.2013