Как изменить положение элементов меню на панели действий - программирование
Подтвердить что ты не робот

Как изменить положение элементов меню на панели действий

Я разрабатываю одно приложение, в котором мне нужно добавить настраиваемый макет на панели действий. Добавление пользовательского макета выполняется, но когда я добавляю элементы меню на панели действий, мой пользовательский макет меняет его положение справа от панели действий до центра панели действий. Ниже изображен то, что я достиг до сих пор.

Done till here

Мне нужно что-то подобное на панели действий.

Like this

Пользовательский макет (желтая кнопка) в правой части панели действий и пунктов меню посередине.

Добавление моего кода для достижения этого настраиваемого макета с помощью встроенной панели действий для Android:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    getActionBar().setDisplayHomeAsUpEnabled(true);
    getActionBar().setHomeButtonEnabled(true);

    actionBar = getActionBar();
    actionBar.setDisplayShowTitleEnabled(false);
    actionBar.setDisplayUseLogoEnabled(false);
    actionBar.setDisplayHomeAsUpEnabled(false);
    actionBar.setDisplayShowCustomEnabled(true);
    cView = getLayoutInflater().inflate(R.layout.header, null);
    actionBar.setCustomView(cView);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.websearch_menu, menu);
    return true;

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {

    case android.R.id.home:
        finish();

    default:
        return super.onOptionsItemSelected(item);
    }
}

Как это можно достичь?

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

4b9b3361

Ответ 1

Я предполагаю, что вы настраиваете свое пользовательское представление как пользовательское представление в панели действий. Если вы используете ActionbarSherlock, вы можете вместо этого добавить пользовательский вид в качестве обычного элемента меню и установить для него вид действия с помощью .setActionView(yourCustomView or yourCustomLayoutId). Затем вы можете установить .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS), чтобы отобразить представление. Просто убедитесь, что ваш пользовательский вид установлен на ширину wrap_content или иначе он вытолкнет другие пункты меню с экрана. Это может также работать без ActionbarSherlock, но я еще не пробовал его там.

EDIT: попробуйте изменить метод onCreateOptionsMenu

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.websearch_menu, menu);

    // add this
    menu.add(Menu.NONE, 0, Menu.NONE, "custom")
        .setActionView(R.layout.header)
        .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);

    return true;
}

и удалите это из метода onCreate

actionBar.setDisplayShowCustomEnabled(true);
cView = getLayoutInflater().inflate(R.layout.header, null);
actionBar.setCustomView(cView);

EDIT:

Если вам нужно ссылаться на представления из вашего настраиваемого макета, вы можете сделать это в своем методе onCreateOptionsMenu следующим образом (примечание: я написал этот код в браузере, поэтому не гарантирую, что я не сделал опечатку или что-то):

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    // inflate the menu and add the item with id viewId,
    // which has your layout as actionview

    View actionView = menu.getItem(viewId).getActionView();
    View viewFromMyLayout = actionView.findViewById(R.id.viewFromMyLayout);

    // here you can set listeners to your view or store a reference 
    // to it somewhere, so you can use it later

    return true;
}

Ответ 2

Просто используйте orderInCategory в вашем xml файле, и он будет заказывать от меньшего числа до большего (с левой стороны панели действий). Например:

<item
    android:id="@+id/Refresh"
    android:icon="@drawable/ic_action_refresh"
    android:showAsAction="ifRoom"
    android:title="@string/refresh"
    android:orderInCategory="2"/>
<item
    android:id="@+id/Search"
    android:icon="@drawable/ic_action_action_search"
    android:showAsAction="ifRoom|collapseActionView"
    android:title="@string/search"
    android:orderInCategory="1"/>

Несмотря на то, что элемент Обновить идет первым в XML файле, он не будет первым. Но значок Поиск слева направо в своей панели действий будет первым в соответствии с его атрибутом orderInCategory.

Ответ 3

Порядок элементов меню будет установлен в соответствии с их порядком в файле XML, который они накачаны.

Поэтому все, что вам нужно сделать, это изменить порядок в файле XML по своему усмотрению.

Ответ 4

Один из способов добиться этого - вызывать invalidateOptionMenu и в onCreateOptionsMenu, поместите элементы в соответствии с порядком, который вы хотите разместить.

Кстати, если вы используете ActionBarSherlock, этот метод доступен, поэтому игнорируйте предупреждения Lint об этом.