Панель действий, как изменить вид при нажатии на элемент

Как я могу изменить вид элемента в раскрывающемся списке навигации на панели действий при нажатии? После щелчка я хочу, чтобы отображаемый элемент отображал другой вид (в макете он установлен как невидимый). У меня есть метод onNavigationItemSelected из ActionBar.OnNavigationListener, но он не передает представление о нажатом элементе, а только положение элемента в навигационном счетчике. Или, другими словами, почему я не могу получить ссылку на выбранный вид из счетчика панели действий? (например, я могу получить представление с listview onItemClick от OnItemClickListener())


person VladacusB    schedule 29.06.2012    source источник


Ответы (3)


Идентификатор Spinner ресурса ActionBar: android:id/action_bar_spinner

Получите идентификатор ресурса Spinner:

int resId = getResources().getIdentifier("action_bar_spinner", "id", "android");

Получите ссылку на виджет Spinner, используя идентификатор ресурса:

final Spinner spinner = (Spinner) getWindow().getDecorView().findViewById(resId);

Теперь вы сможете получить доступ к выбранному представлению:

CheckedTextView v = (CheckedTextView) spinner.getSelectedView();

Вы можете сразу изменить выбранный вид в OnNavigationListener:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    getFragmentManager().beginTransaction()
    .replace(android.R.id.content, new MyFragment())
    .commit();

    SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(this,
            R.array.action_list, android.R.layout.simple_spinner_dropdown_item);

    getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);

    int resId = getResources().getIdentifier("action_bar_spinner", "id", "android");
    final Spinner spinner = (Spinner) getWindow().getDecorView().findViewById(resId);

    this.getActionBar().setListNavigationCallbacks(mSpinnerAdapter, new ActionBar.OnNavigationListener() {

        @Override
        public boolean onNavigationItemSelected(int itemPosition,
                long itemId) {
            CheckedTextView v = (CheckedTextView) spinner.getSelectedView();
            // Modify selected view.
            return true;
        }

    });
}
person Manish Mulimani    schedule 19.08.2014
comment
как вы узнали, что такое идентификатор ресурса? - person CQM; 19.08.2014
comment
Использование функции DDMS Dump View Hierarchy. - person Manish Mulimani; 19.08.2014
comment
resId = 0 отсюда. Я тоже использую настоящую панель действий (без режима совместимости) - person CQM; 19.08.2014
comment
@CQM Я вставил onCreate код. resId должен быть получен после вызова setNavigationMode. Дайте мне знать, работает ли это для вас. - person Manish Mulimani; 20.08.2014
comment
это в моем onCreateView в моем фрагменте, и после setNavigationMode все мои конфигурации панели действий относятся к этому фрагменту и происходят в его жизненном цикле. Все еще получаю resId = 0 - person CQM; 20.08.2014
comment
@CQM Странно. В целях отладки вы можете попробовать сделать View Hierarchy снимок экрана с помощью DDMS. Благодаря этому вы получите идентификатор. - person Manish Mulimani; 20.08.2014
comment
это работало на Nexus 5, но не на Nexus 4 или некоторых других устройствах для меня, а также на разных версиях Android - person CQM; 23.08.2014

Я просто пытался понять это, и мне удалось отследить это.

Для этого используйте setSelectedNavigationItem.

person mlmkvr    schedule 30.06.2012
comment
Спасибо, но метод setSelectedNavigationItem просто устанавливает выбранный элемент в навигации на панели действий. Что мне нужно, так это способ получить ссылку на выбранный вид элемента в счетчике (тот, который показан выбранным на счетчике панели действий), а затем изменить его по мере необходимости. - person VladacusB; 02.07.2012

С помощью вашего navigationListener вы можете попробовать следующее:

OnNavigationListener navigationListener = new OnNavigationListener() {

  @Override
  public boolean onNavigationItemSelected(int itemPosition, long itemId) {
    View convertView = null;
    View view = adapter.getView(itemPosition, convertView, null);
    TextView myTextView = (TextView) view
        .findViewById(R.id.my_textView);
    Toast.makeText(getBaseContext(), myTextView.getText(),
        Toast.LENGTH_LONG).show();

    return true;
  }

Затем вы извлекаете элемент через адаптер. Моя единственная проблема теперь заключается в изменении полученного эталонного содержимого. Я не могу заставить его работать.

Я надеюсь, что это помогает

person kaffein    schedule 11.09.2012
comment
да, это не работает, кажется, это на правильном пути, хотя - person CQM; 19.08.2014