web-dev-qa-db-fra.com

Comment puis-je forcer la barre d'action à être en bas dans ICS?

Sandwich à la crème glacée (Android 4.0) ajoute la possibilité d'avoir le Action Bar au bas de l'écran sur les téléphones, et c'est quelque chose que j'aimerais avoir dans une de mes applications. Les docs mentionnent uiOptions="splitActionBarWhenNarrow" pour quand vous voulez quelque chose, c'est-à-dire des onglets, en haut et Action Bar raccourcis en bas. J'ai essayé d'ajouter la ligne dans le manifeste d'application, comme décrit dans la documentation, mais je ne l'ai pas encore fait fonctionner.

Voici un exemple:

enter image description here

J'ai également remarqué que sur mon Galaxy Nexus, qui exécute ICS, l'application de messagerie a le Action Bar en bas et rien que le titre en haut, donc il doit être possible de forcer en quelque sorte le Action Bar être en bas.

Des idées?

42
Michell Bak

J'ai essayé d'ajouter la ligne dans le manifeste d'application, comme décrit dans la documentation, mais je ne l'ai pas encore fait fonctionner.

Cela a fonctionné pour moi dans cet exemple de projet . Voici le manifeste:

<?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>

De plus, j'ai remarqué que sur mon Galaxy Nexus, qui exécute ICS, l'application de messagerie a la barre d'action en bas et rien que le titre en haut, il doit donc être possible de forcer la barre d'action en bas.

Si vous faites référence à la liste de conversations, c'est le ActionBar en haut et en bas, en utilisant splitActionBarWhenNarrow et le code d'installation suivant:

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

J'utilise ActionBarSherlock et j'ai eu un problème similaire. Je l'ai résolu en mettant Android:uiOptions="splitActionBarWhenNarrow" dans le <activity> tag, plutôt que <application> tag.

Par exemple, cela a fonctionné:

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

et cela n'a pas fonctionné:

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

Modifier voici l'image :). InstaGram ActionBar + Bottom Bar

de retour avec de meilleurs résultats :). la première chose que vous devez faire est de créer un nom de mise en page it 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>

après cela, accédez à votre classe MainActivity.class et créez cette méthode.

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

} 

ajoutez setupActionBar(); à votre activité onCreate et exécutez votre application :).

vous avez maintenant un ActionBar personnalisé avec des séparateurs et des images P.S le diviseur est défini dans la mise en page comme un fond d'image :).

4
k0sh

vous ne pouvez pas forcer à rester en bas sur les tablettes, mais si vous téléphonez, vous pouvez le faire via le manifeste. mais vous pouvez faire quelque chose de similaire à la barre inférieure et à la barre supérieure. Dans cet exemple, je vais vous montrer comment utiliser la fusion pour le faire facilement sans avoir besoin d'utiliser Android ActionBar.

la première chose que vous devez créer est votre main_activity.xml dans mon cas, le main_activity.xml contient uniquement ImageView sur RelativeLayout. voici le code.

<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>

comme vous pouvez le voir dans le code ci-dessus, il y a deux fusions que je mets à l'intérieur du main_activity.xml un défini en bas et un défini en haut. voici la fausse barre inférieure 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>

je mets un arrière-plan fixe au LinearLayout et simule l'ImageView pour onClicks.

et voici la barre du haut. "

<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>

"

qui copie également la pâte de la barre inférieure ci-dessus. il suffit de changer une chose de Android:layout_alignParentBottom="true" à Android:layout_alignParentTop="true" et vous avez obtenu une actionBar en bas et en haut. dans ce cas, vous n'aurez pas besoin d'utiliser l'ActionBar, donc je vous suggère d'utiliser Theme.Holo.NoActionBar

et voici le résultat de l'image: - http://i.imgur.com/N8uKg6v.png

c'est un projet sur lequel je travaille maintenant. fait presque tout, mais toujours aux prises avec le design. j'espère que ma réponse vous sera bénéfique. veuillez voter pour la réponse si vous l'avez trouvée intéressante.
meilleures salutations. ~ Kosh

3
k0sh

essaye ça...

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);
}
0
Gopal Gopi