Как изменить положение элементов меню на панели действий
Я разрабатываю одно приложение, в котором мне нужно добавить настраиваемый макет на панели действий. Добавление пользовательского макета выполняется, но когда я добавляю элементы меню на панели действий, мой пользовательский макет меняет его положение справа от панели действий до центра панели действий. Ниже изображен то, что я достиг до сих пор.
![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);
}
}
Как это можно достичь?
Любая помощь будет оценена.
Ответы
Ответ 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 об этом.