it-swarm.com.ru

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

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

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);
    }
}

Как этого достичь?

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

14
Anupam

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

Правка: попробуйте изменить свой метод 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);

Правка:

Если вам нужно сослаться на представления из вашего пользовательского макета, вы можете сделать это в своем методе 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;
}
3
Thrakbad

Просто используйте 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"/>

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

13
Rashid

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

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

2
oznus

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

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

0
android developer