Как я могу заставить панель действий быть в нижней части ICS? - PullRequest
42 голосов
/ 11 декабря 2011

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

Вот пример:

enter image description here

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

Есть идеи?

Ответы [ 5 ]

28 голосов
/ 12 декабря 2011

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

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

<?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);
}
12 голосов
/ 25 марта 2012

Я использую 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">
4 голосов
/ 01 февраля 2013

Редактировать здесь это изображение :).InstaGram ActionBar + Bottom Bar

снова с лучшими результатами :).Первое, что вам нужно сделать, это создать имя макета, это 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 Activity и запустите ваше приложение:).

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

3 голосов
/ 30 января 2013

ну, вы не можете заставить оставаться на дне на планшетах, но если вы звоните, вы можете сделать это через манифест.но вы можете сделать что-то похожее на нижнюю панель и верхнюю панель.В этом примере я покажу вам, как использовать слияние, чтобы сделать это легко без необходимости использования 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, поэтому я предлагаю вам использовать Theme.Holo.NoActionBar

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

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

0 голосов
/ 07 августа 2013

попробуйте это ...

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