42

向きの変更時にアクティビティを再開するという問題を修正しようとしています。

ActionBarドロップダウン リスト ナビゲーションがあり、ローテーションごとにこのリストの最初の要素がアクティブになります。コンテンツを保持fragmentすることは難しくありませんでしたが、アクティブ リスト アイテムを設定する方法がわかりません。

の定義は次のActionBarとおりです。

getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
ArrayAdapter<CharSequence> list = ArrayAdapter
    .createFromResource(this, R.array.action_list, android.R.layout.simple_dropdown_item_1line);
list.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
getActionBar().setListNavigationCallbacks(list, this);

そして、ここに私の回避策があります:

@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
    if (!application.isRotated) {
        application.activePosition = itemPosition;
        application.activeId = itemId;
        getFragmentManager().beginTransaction()
            .replace(android.R.id.content, MyFragment.newInstance(itemPosition))
            .commit();
    } else {
        application.isRotated = false;
        this.onNavigationItemSelected(application.activePosition, application.activeId);            
    }
    return true;
}

@Override
protected void onStop() {
    super.onStop();
    application.isRotated = true;
}

それが最善の解決策かどうかはわかりません。

4

5 に答える 5

83

私はちょうどその機能を見つけました。ですsetSelectedNavigationItem(int position)

選択したナビゲーション項目をリストまたはタブ付きナビゲーションモードで設定します。

例:

actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
actionBar.setListNavigationCallbacks(adapter, this);
actionBar.setSelectedNavigationItem(position);
于 2012-01-28T15:35:53.357 に答える
0

私も同じ問題を経験していました。多くの調査を行って、ここで解決策を見つけました:

http://mohitum.wordpress.com/tutorials/android/ -->ヒント 5 の下。

OnPageChangeListener を実装し、 onPageSelected(int position) でこのメソッドを次のように呼び出します。

@Override
public void onPageSelected(int position) {
  mActionBar.setSelectedNavigationItem(position);
  selectInSpinnerIfPresent(position, true);
}
private void selectInSpinnerIfPresent(int position, boolean animate) {
  try {
    ActionBar actionBarView = mActionBar;
    Class<?> actionBarViewClass = actionBarView.getClass();
    Field mTabScrollViewField = actionBarViewClass.getDeclaredField(“mTabScrollView”);
    mTabScrollViewField.setAccessible(true);
    Object mTabScrollView = mTabScrollViewField.get(actionBarView);
    if (mTabScrollView == null) {
      return;
    }
    Field mTabSpinnerField = mTabScrollView.getClass().getDeclaredField(“mTabSpinner”);
    mTabSpinnerField.setAccessible(true);
    Object mTabSpinner = mTabSpinnerField.get(mTabScrollView);
    if (mTabSpinner == null) {
      return;
    }
    Method setSelectionMethod = mTabSpinner.getClass().getSuperclass().getDeclaredMethod(“setSelection”, Integer.TYPE, Boolean.TYPE);
    setSelectionMethod.invoke(mTabSpinner, position, animate);
    Method requestLayoutMethod = mTabSpinner.getClass().getSuperclass().getDeclaredMethod(“requestLayout”);
    requestLayoutMethod.invoke(mTabSpinner);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

これが他の誰かにも役立つことを願っています。

于 2013-04-02T10:08:05.140 に答える
0

Gist のコードスニペット


@Override
public void onPageScrollStateChanged(int state) {
}


@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}


@Override
public void onPageSelected(int position) {
    actionBar.setSelectedNavigationItem(position);

    selectInSpinnerIfPresent(position, true);
}


/**
 * Hack that takes advantage of interface parity between ActionBarSherlock and the native interface to reach inside
 * the classes to manually select the appropriate tab spinner position if the overflow tab spinner is showing.
 * 
 * Related issues: https://github.com/JakeWharton/ActionBarSherlock/issues/240 and
 * https://android-review.googlesource.com/#/c/32492/
 * 
 * @author toulouse@crunchyroll.com
 */
private void selectInSpinnerIfPresent(int position, boolean animate) {
    try {
        View actionBarView = findViewById(R.id.abs__action_bar);
        if (actionBarView == null) {
            int id = getResources().getIdentifier("action_bar", "id", "android");
            actionBarView = findViewById(id);
        }

        Class<?> actionBarViewClass = actionBarView.getClass();
        Field mTabScrollViewField = actionBarViewClass.getDeclaredField("mTabScrollView");
        mTabScrollViewField.setAccessible(true);

        Object mTabScrollView = mTabScrollViewField.get(actionBarView);
        if (mTabScrollView == null) {
            return;
        }

        Field mTabSpinnerField = mTabScrollView.getClass().getDeclaredField("mTabSpinner");
        mTabSpinnerField.setAccessible(true);

        Object mTabSpinner = mTabSpinnerField.get(mTabScrollView);
        if (mTabSpinner == null) {
            return;
        }

        Method setSelectionMethod = mTabSpinner.getClass().getSuperclass().getDeclaredMethod("setSelection", Integer.TYPE, Boolean.TYPE);
        setSelectionMethod.invoke(mTabSpinner, position, animate);

        Method requestLayoutMethod = mTabSpinner.getClass().getSuperclass().getDeclaredMethod("requestLayout");
        requestLayoutMethod.invoke(mTabSpinner);
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }
}

公式の Android バグに関するこのハックは私のためにそれを行いましたが、上記のコードニペットはそうではありませんでした :/

于 2013-04-21T10:26:42.163 に答える