Как заставить панель действий быть внизу в ICS?

Ice Cream Sandwich (Android 4.0) добавляет возможность наличия Action Bar в нижней части экрана на телефонах, и это то, что я хотел бы иметь в своем приложении. В документах упоминается uiOptions="splitActionBarWhenNarrow" когда вы хотите что-то, то есть вкладки, вверху и ярлыки Action Bar внизу. Я попытался добавить строку в манифест приложения, как описано в документах, но пока не работает.

Вот пример:

Введите описание изображения здесь

Кроме того, я заметил, что на моем Galaxy Nexus, который запускает ICS, приложение для обмена сообщениями имеет Action Bar внизу и ничего, кроме названия сверху, поэтому должно быть возможно, чтобы заставить Action Bar быть внизу.

Есть идеи?

Solutions Collecting From Web of "Как заставить панель действий быть внизу в ICS?"

Я попытался добавить строку в манифест приложения, как описано в документах, но пока не работает.

Он работал для меня в этом типовом проекте . Вот манифест:

 <?xml version="1.0" encoding="utf-8"?> <manifest package="com.commonsware.android.actionbarbc" xmlns:android="http://schemas.android.com/apk/res/android"> <application android:hardwareAccelerated="true" android:icon="@drawable/cw" android:label="@string/app_name"> <activity android:label="@string/app_name" android:name=".InflationDemo" android:uiOptions="splitActionBarWhenNarrow"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="11" /> <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:smallScreens="true" android:xlargeScreens="true" /> </manifest> 

Кроме того, я заметил, что на моем Galaxy Nexus, который запускает ICS, приложение для обмена сообщениями имеет панель действий внизу и ничего, кроме названия сверху, поэтому должно быть возможно, чтобы заставить панель действий быть внизу.

Если вы ссылаетесь на список разговора, это ActionBar сверху и снизу, используя splitActionBarWhenNarrow и следующий код настройки:

 private void setupActionBar() { ActionBar actionBar = getActionBar(); ViewGroup v = (ViewGroup)LayoutInflater.from(this) .inflate(R.layout.conversation_list_actionbar, null); actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM, ActionBar.DISPLAY_SHOW_CUSTOM); actionBar.setCustomView(v, new ActionBar.LayoutParams(ActionBar.LayoutParams.WRAP_CONTENT, ActionBar.LayoutParams.WRAP_CONTENT, Gravity.CENTER_VERTICAL | Gravity.RIGHT)); mUnreadConvCount = (TextView)v.findViewById(R.id.unread_conv_count); } 

Я использую ActionBarSherlock, и у меня была аналогичная проблема. Я решил это, поставив android:uiOptions="splitActionBarWhenNarrow" в <activity> , а не <application> .

Например, это сработало:

 <activity android:name=".my.Activity" android:uiOptions="splitActionBarWhenNarrow"/> 

И это не сработало:

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.slowchop.etc" android:uiOptions="splitActionBarWhenNarrow"> 

Изменить вот изображение :). InstaGram ActionBar + нижняя панель

Назад с лучшими результатами :). Первое, что вам нужно сделать, это создать имя макета – header.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="@dimen/action_bar_height" android:layout_gravity="top" android:baselineAligned="true" android:orientation="horizontal" > <ImageView android:id="@+id/share" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="start" android:layout_weight=".14" android:background="@drawable/action_bar_left_button" android:src="@drawable/action_bar_glyph_back" /> <ImageView android:id="@+id/bright" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight=".14" android:background="@drawable/action_bar_left_button" android:src="@drawable/action_bar_glyph_lux" /> <ImageView android:id="@+id/rotate" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight=".14" android:background="@drawable/action_bar_left_button" android:src="@drawable/rotate" /> <ImageView android:id="@+id/bright" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight=".14" android:background="@drawable/action_bar_left_button" android:src="@drawable/action_bar_glyph_lux" /> <ImageView android:id="@+id/rotate" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight=".14" android:background="@drawable/action_bar_left_button" android:src="@drawable/rotate" /> <ImageView android:id="@+id/forwa" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight=".14" android:background="@drawable/action_bar_left_button" android:src="@drawable/forward" /> </LinearLayout> 

После этого перейдите в свой MainActivity.class и создайте этот метод.

  private void setupActionBar() { ActionBar actionBar = getActionBar(); //actionBar.setDisplayShowHomeEnabled(false); actionBar.setDisplayShowTitleEnabled(false); ViewGroup v = (ViewGroup)LayoutInflater.from(this) .inflate(R.layout.header, null); actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM, ActionBar.DISPLAY_SHOW_CUSTOM); actionBar.setCustomView(v, new ActionBar.LayoutParams(ActionBar.LayoutParams.MATCH_PARENT, ActionBar.LayoutParams.WRAP_CONTENT, Gravity.CENTER_VERTICAL | Gravity.RIGHT)); } 

Добавьте setupActionBar(); К вашей активности onCreate и запустите приложение :).

Теперь у вас есть пользовательский ActionBar с разделителями и изображениями PS, разделитель определяется в макете как фон изображения :).

Хорошо, вы не можете заставить оставаться внизу на планшетах, но если телефон да, вы можете сделать это через манифест. Но вы можете сделать что-то похоже на нижнюю панель и верхнюю панель. В этом примере я покажу вам, как использовать слияние, чтобы сделать это легко, без необходимости использования android ActionBar.

Первое, что вам нужно создать, это ваш main_activity.xml в моем случае main_activity.xml содержит только ImageView на RelativeLayout. Вот код.

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <RelativeLayout android:id="@+id/RelativeLayout04" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true"> <include layout="@layout/header" /> </RelativeLayout> <ImageView android:id="@+id/view" android:layout_width="match_parent" android:layout_height="200dp" android:layout_above="@+id/RelativeLayout03" android:layout_below="@+id/RelativeLayout04" android:layout_centerHorizontal="true" android:src="@android:drawable/alert_dark_frame" /> <RelativeLayout android:id="@+id/RelativeLayout03" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true"> <include layout="@layout/tryit" /> </RelativeLayout> 

Как вы можете видеть в приведенном выше коде, есть два слияния, которые я помещаю внутри main_activity.xml определенного внизу, и один, определенный в верхней части. Вот фальшивый нижний бит xml.

 <merge xmlns:android="http://schemas.android.com/apk/res/android"> <LinearLayout android:id="@+id/LinearLayout01" android:layout_width="match_parent" android:layout_height="80dp" android:layout_weight="0.14" android:background="@drawable/dock" > <ImageView android:id="@+id/dark" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="0.14" /> <ImageView android:id="@+id/stock" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="0.14" /> <ImageView android:id="@+id/open" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="0.14" /> <ImageView android:id="@+id/border" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="0.15" /> <ImageView android:id="@+id/color" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="0.15" /> </LinearLayout> 

Я помещаю фиксированный фон в LinearLayout и подделываю ImageView для onClicks.

И вот верхний бар. `

 <LinearLayout android:id="@+id/LinearLayout02" android:layout_width="match_parent" android:layout_height="40dp" android:layout_weight="0.14" android:background="@drawable/dock1" android:layout_gravity="top"> <ImageView android:id="@+id/darka" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="0.14" /> <ImageView android:id="@+id/stocka" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="0.14" /> <ImageView android:id="@+id/opena" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="0.14" /> <ImageView android:id="@+id/bordera" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="0.15" /> <ImageView android:id="@+id/colora" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="0.15" /> </LinearLayout> 

`

Которые также копируют пасту из нижней панели выше. Просто измените одну вещь с android:layout_alignParentBottom="true" на android:layout_alignParentTop="true" и вы получили actionBar внизу и вверху. В этом случае вам не нужно использовать ActionBar, поэтому я предлагаю вам использовать Theme.Holo.NoActionBar

И вот результат изображения: – http://i.imgur.com/N8uKg6v.png

Это проект, над которым я сейчас работаю. Сделал почти все, но все еще борется с дизайном. Надеюсь, мой ответ принесет вам пользу. Пожалуйста, проголосуйте за ответ, если вы считаете это интересным.
с наилучшими пожеланиями. ~ Кош

попробуй это…

 private View contentView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); contentView = getLayoutInflater().inflate(R.layout.activity_main, null); setContentView(contentView); LinearLayout layout = (LinearLayout) contentView.getParent().getParent(); View view = layout.getChildAt(0); layout.removeViewAt(0); layout.addView(view); }