FragmentTransaction .attach и .detach для вкладок панели действий - PullRequest
10 голосов
/ 06 ноября 2011

Я пытаюсь заставить код здесь работать. Компилируется нормально. Это будет работать. И он загрузит вкладку 1 (из 3). Однако, когда я нажимаю на 2-ю или 3-ю вкладку, я получаю это:

java.lang.NoSuchMethodError: android.app.FragmentTransaction.detach

это происходит в коде здесь

public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    if (mFragment != null) {
        //ft.detach(mFragment); //requires API Level 13
        ft.remove(mFragment); //this does not do the same thing as detach
    }
}

Я обнаружил, что detach доступен только для API уровня 13. Я пытался удалить , но, очевидно, это не делает того же У кого-нибудь есть идеи о том, как преодолеть это, основываясь на коде в первой ссылке ?


EDIT: Я полагаю, что то же самое относится к attach , как и в коде, но не срабатывает до сбоя приложения.

Ответы [ 3 ]

13 голосов
/ 06 ноября 2011

Похоже, что замена нескольких мест в коде, которые ссылаются на присоединение и отсоединение, на добавление и удаление, позволит коду нормально функционировать в среде до уровня API 13.

    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.remove(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); //requires API 13
            ft.remove(mFragment); //this does not do the same thing as detach
        }
    }
2 голосов
/ 25 марта 2012

если вы используете FragmentTransaction в пакете совместимости API 4+ -android.support.v4.app.FragmentTransaction - у вас должна быть возможность вызывать методы присоединения и отсоединения на платформах до уровня API 13.

http://developer.android.com/resources/samples/Support4Demos/index.html

1 голос
/ 11 января 2013

или просто используйте http://actionbarsherlock.com/ у вас будет постоянный опыт действий от 2.x до

...