42 votes

Barre d'action - vue personnalisée avec ImageView centrée, éléments d'action sur les côtés

J'ai besoin de centrer un logo personnalisé (à l'aide d'une ImageView) dans la barre d'action de l'activité "Accueil". J'utilise ABS pour ce projet. Cette question est très similaire à une autre question postée sur S.O. ( Logo ActionBar centré et éléments d'action sur les côtés ), mais je ne suis pas sûr que l'ImageView ou le menu de recherche fasse une différence, car je n'obtiens pas les résultats que je recherche (une image centrée), ou si je me suis simplement trompé. En fait, je place une icône sur la gauche, j'insère la vue personnalisée au centre et j'ai une icône de recherche sur la droite (menu Options). L'image apparaît un peu à droite de l'icône, mais elle n'est toujours pas centrée. Toute indication sur la façon de centrer une ImageView dans la barre d'action serait très appréciée.

Home.java :

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);

    LayoutInflater inflater = (LayoutInflater) getSupportActionBar().getThemedContext()
            .getSystemService(LAYOUT_INFLATER_SERVICE);

    final View customActionBarView = inflater.inflate(
            R.layout.actionbar_custom_view_home, null);

    /* Show the custom action bar view and hide the normal Home icon and title */
    final ActionBar actionBar = getSupportActionBar();
    actionBar.setHomeButtonEnabled(true);
    actionBar.setDisplayHomeAsUpEnabled(false);
    actionBar.setDisplayShowTitleEnabled(false);
    actionBar.setIcon(R.drawable.ic_ab_som);
    actionBar.setCustomView(customActionBarView);
    actionBar.setDisplayShowCustomEnabled(true);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = new MenuInflater(this);
    inflater.inflate(R.menu.search, menu);
    return true;
}

res/layout/actionbar_custom_view_home.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="wrap_content"
android:orientation="horizontal"
android:layout_gravity="center">

<ImageView
    android:id="@+id/actionBarLogo"
    android:contentDescription="@string/application_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:clickable="false"
    android:duplicateParentState="false"
    android:focusable="false"
    android:longClickable="false"
    android:padding="@dimen/padding_small"
    android:src="@drawable/logo_horizontal" />

</LinearLayout>

res/menu/search.xml :

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item 
        android:id="@id/search_item"
        android:icon="?attr/action_search"
        android:title="@string/search_label"
        android:showAsAction="ifRoom|collapseActionView">
    </item>
</menu>

0 votes

Jetez un coup d'œil à ma question ici : stackoverflow.com/questions/23783381/

2voto

Alexey Osminin Points 170

Je suis confronté au même problème et je propose la solution suivante :

  1. dans votre res/layout/actionbar_custom_view_home.xml changez la largeur du layout en wrap_content :

    android:layout_width="wrap_content"
  2. Obtenez la largeur de la barre d'action comme ceci :

    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    //width of action bar is the same as width of whole screen
    final int actionBarWidth = size.x;
  3. Ajoutez le layoutListener à votre customActionBarView :

    customActionBarView.addOnLayoutChangeListener(
      new OnLayoutChangeListener() {
    
        @Override
        public void onGlobalLayout() {
          float x = customActionBarView.getX();
          int logoImageWidth = imageLogo.getWidth();
          int logoPosition = actionBarWidth / 2 - logoImageWidth / 2;
          if (x != logoPosition) {
            customActionBarView.setX(logoPosition);
            customActionBarView.requestLayout();
          } else {
            customActionBarView.removeOnLayoutChangeListener(this);
          }
        }
      }
    );

2voto

walla Points 263

La seule chose qui fonctionne est le putting (mettre à droite ou à gauche selon les besoins, ou les deux) :

android:layout_marginLeft|Right="?attr/actionBarSize"

que j'ai trouvé ici : http://sourcey.com/Android-custom-centered-actionbar-with-material-design/

0voto

Bamdeb Ghosh Points 145

Pour moi, "layoutParams.leftMargin" a fait la magie. Je suis capable de pousser l'icône de gauche à droite.

    androidx.appcompat.app.ActionBar actionBar = getSupportActionBar();
    actionBar.setDisplayOptions(actionBar.getDisplayOptions()
            | ActionBar.DISPLAY_SHOW_CUSTOM);
    actionBar.setDisplayOptions(actionBar.getDisplayOptions());
    ImageView imageView = new ImageView(actionBar.getThemedContext());
    imageView.setImageResource(R.drawable.content_copy);

    ActionBar.LayoutParams layoutParams = new ActionBar.LayoutParams(
            ActionBar.LayoutParams.WRAP_CONTENT,
            ActionBar.LayoutParams.WRAP_CONTENT
            );
    layoutParams.leftMargin = 50;
    imageView.setLayoutParams(layoutParams);

    actionBar.setCustomView(imageView);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X