Android ActionBar - нажмите на пользовательский вид в нижней части экрана.
У меня есть split ActionBar, и я пытаюсь добавить функциональность, почти идентичную игре Google Now, которая теперь играет.
Я могу получить пункты меню, которые будут отображаться в нижней части экрана, используя onCreateOptionsMenu, но я не могу заставить пользовательский вид появляться в нижней части экрана при использовании actionBar.setCustomView. Пользовательский вид просто находится под верхним ActionBar.
Кто-нибудь знает, как заставить пользовательское представление снизу или добавить пользовательские представления в onCreateOptionsMenu?
Вот фрагменты моего кода:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
//Custom view to add
actionBar.setCustomView(R.layout.albumitem);
//This view shows up just under the top actionbar at the moment,
despite menu items being at the bottom
Код параметров меню: (Они отображаются внизу, где мне бы хотелось, чтобы мое пользовательское представление было)
@Override
public boolean onCreateOptionsMenu(Menu menu) {
new MenuInflater(this).inflate(R.menu.option_menu, menu);
return (super.onCreateOptionsMenu(menu));
}
Я считаю, что теперь играющее меню в нижней части приложения для воспроизведения музыки Google - это настраиваемый вид внутри панели действий split:
![Google Play Music]()
Ответы
Ответ 1
Так мне удалось найти грязное решение для этого.. Ну, грязно в моем любительском мнении..
В oncreateOptionsMenu я надул меню с именем option_menu, например:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
new MenuInflater(this).inflate(R.menu.option_menu, menu);
И в xml для этого элемента option_menu я применил actionViewClass, и в этом случае я использовал относительный макет (я предполагаю, что я мог бы просто использовать View..?):
<item
android:id="@+id/layout_item"
android:actionViewClass="android.widget.RelativeLayout"
android:showAsAction="always|withText"
android:title="Text 1"/>
</menu>
Итак, я надул макет xml и добавил его в layout_item, определенный в моем меню:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
new MenuInflater(this).inflate(R.menu.option_menu, menu);
relativeLayout = (RelativeLayout) menu.findItem(R.id.layout_item)
.getActionView();
View inflatedView = getLayoutInflater().inflate(R.layout.now_playing,
null);
relativeLayout.addView(inflatedView);
return (super.onCreateOptionsMenu(menu));
}
Пожалуйста, не стесняйтесь редактировать/улучшать этот ответ по своему усмотрению.
Ответ 2
Я сделал решение на основе вашего, включая пользовательский макет поверх + пользовательский макет внизу + название/субтитр + значок дома. Вот код:
public class SplitABActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActionBar ab = getActionBar();
ab.setTitle("Action Bar Title");
ab.setSubtitle("Action Bar Subtitle");
ab.setDisplayShowHomeEnabled(true);
LayoutInflater inflater = (LayoutInflater) getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
RelativeLayout layout = (RelativeLayout) inflater.inflate(R.layout.ab_custom_layout, null);
ab.setCustomView(layout);
ab.setSplitBackgroundDrawable(new ColorDrawable(Color.BLUE));
ab.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_including_layout, menu);
RelativeLayout layout = (RelativeLayout) menu.findItem(R.id.layout_item).getActionView();
View v = getLayoutInflater().inflate(R.layout.ab_bottom_layout, null);
layout.addView(v);
return super.onCreateOptionsMenu(menu);
}
}
ab_custom_layout.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="right"
>
<TextView android:id="@+id/element1"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:textColor="#fff"
android:background="#ff0000"
android:text="Element 1"/>
<TextView
android:id="@+id/element2"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:textColor="#000"
android:background="#f0f0f0"
android:layout_toRightOf="@+id/element1"
android:text="Element 2"/>
</RelativeLayout>
menu_including_layout.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/action1"
android:title="Action 1"
android:icon="@android:drawable/ic_dialog_alert"
android:showAsAction="ifRoom" />
<item android:id="@+id/action2"
android:title="Action 2"
android:icon="@android:drawable/ic_dialog_info"
android:showAsAction="ifRoom" />
<item
android:id="@+id/layout_item"
android:actionViewClass="android.widget.RelativeLayout"
android:showAsAction="always|withText"
android:title="Layout Item"/>
</menu>
ab_bottom_layout.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:id="@+id/bottom_layout_txt_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click this button"/>
<ImageButton android:id="@+id/bottom_layout_btn_chat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_menu_camera"
android:layout_toRightOf="@+id/bottom_layout_txt_status"
android:contentDescription="@string/app_name"/>
</RelativeLayout>
Код работает идеально для меня. Я вижу раскол ActionBar, когда мой планшет находится на портрете. На ландшафте он достаточно широкий, чтобы хранить все предметы сверху.
Надеюсь, что это поможет