Question Comment afficher une vue personnalisée dans ActionBar?


Je veux afficher la recherche personnalisée dans la barre d'action (j'utilise ActionBarSherlock pour cela).

J'ai compris:

enter image description here

Mais je veux que la mise en page personnalisée (champ edittext) occupe toute la largeur disponible.

J'ai implémenté la mise en page personnalisée comme suggéré ici.

Il y a ma mise en page personnalisée search.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    style="?attr/actionButtonStyle"
    android:layout_width="fill_parent"
    android:layout_height="match_parent"
    android:layout_gravity="fill_horizontal"
    android:focusable="true" >

    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical|fill_horizontal" >

        <EditText
            android:id="@+id/search_query"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="left|center"
            android:background="@drawable/bg_search_edit_text"
            android:imeOptions="actionSearch"
            android:inputType="text" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right|center_vertical"
            android:src="@drawable/ic_search_arrow" />

    </FrameLayout>

</LinearLayout>

Et en MyActivity:

ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowCustomEnabled(true);
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setIcon(R.drawable.ic_action_search);

LayoutInflater inflator = (LayoutInflater) this .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflator.inflate(R.layout.search, null);

actionBar.setCustomView(v);

Comment puis-je faire une mise en page personnalisée pour occuper toute la largeur disponible de actionBar?

Aidez-moi, s'il vous plaît.


85
2017-10-14 15:37


origine


Réponses:


Il y a un truc pour cela. Tout ce que vous avez à faire est d'utiliser RelativeLayout au lieu de LinearLayout comme conteneur principal. Il est important d'avoir android:layout_gravity="fill_horizontal" mis pour cela. Ça devrait le faire.


94
2017-10-14 16:41



J'ai lutté avec cela moi-même et j'ai essayé la réponse de Tomik. Cependant, la mise en page n’a pas été totalement disponible au démarrage, mais uniquement lorsque vous ajoutez quelque chose à la vue.

Vous devrez définir le LayoutParams.FILL_PARENT en ajoutant la vue:

//I'm using actionbarsherlock, but it's the same.
LayoutParams layout = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
getSupportActionBar().setCustomView(overlay, layout); 

De cette façon, il remplit complètement l'espace disponible. (Vous devrez peut-être utiliser la solution de Tomik également).


34
2018-05-20 15:05



Les réponses de Tomik et Peterdk fonctionnent lorsque vous voulez que votre vue personnalisée occupe l'ensemble barre d'action, cachant même le titre natif.

Mais si vous voulez que votre vue personnalisée cohabite avec le titre (et remplisse tout l’espace restant après l’affichage du titre), puis-je vous référer à l’excellente réponse de l’utilisateur Android-Developer ici:

https://stackoverflow.com/a/16517395/614880

Son code au fond a parfaitement fonctionné pour moi.


6
2017-08-06 01:25



C'est comme ça que ça fonctionnait pour moi (les réponses ci-dessus indiquaient aussi bien le titre par défaut que ma vue personnalisée).

ActionBar.LayoutParams layout = new ActionBar.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
// actionBar.setCustomView(view); //last view item must set to android:layout_alignParentRight="true" if few views are there 
actionBar.setCustomView(view, layout); // layout param width=fill/match parent
actionBar.setDisplayShowCustomEnabled(true);//must other wise its not showing custom view.

Ce que j'ai remarqué, c'est que les deux setCustomView(view) et setCustomView(view,params) la vue width = match / fill parent. setDisplayShowCustomEnabled (boolean showCustom)


4
2018-05-08 09:14



Par exemple, vous pouvez définir un fichier de disposition contenant un élément EditText.

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/searchfield"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:inputType="textFilter" >

</EditText> 

tu peux faire

public class MainActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ActionBar actionBar = getActionBar();
    // add the custom view to the action bar
    actionBar.setCustomView(R.layout.actionbar_view);
    EditText search = (EditText) actionBar.getCustomView().findViewById(R.id.searchfield);
    search.setOnEditorActionListener(new OnEditorActionListener() {

      @Override
      public boolean onEditorAction(TextView v, int actionId,
          KeyEvent event) {
        Toast.makeText(MainActivity.this, "Search triggered",
            Toast.LENGTH_LONG).show();
        return false;
      }
    });
    actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM
        | ActionBar.DISPLAY_SHOW_HOME);


    }

3
2018-02-03 07:28



Il existe un exemple dans l’application de lancement d’Android (que j’en ai créé une bibliothèque, ici), dans la classe qui gère le choix des fonds d’écran ("WallpaperPickerActivity").

L'exemple montre que vous devez définir un thème personnalisé pour que cela fonctionne. Malheureusement, cela a fonctionné pour moi uniquement en utilisant le cadre normal, et non celui de la bibliothèque de support.

Voici les thèmes:

styles.xml

 <style name="Theme.WallpaperPicker" parent="Theme.WallpaperCropper">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:colorBackgroundCacheHint">@null</item>
    <item name="android:windowShowWallpaper">true</item>
  </style>

  <style name="Theme.WallpaperCropper" parent="@android:style/Theme.DeviceDefault">
    <item name="android:actionBarStyle">@style/WallpaperCropperActionBar</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowActionBarOverlay">true</item>
  </style>

  <style name="WallpaperCropperActionBar" parent="@android:style/Widget.DeviceDefault.ActionBar">
    <item name="android:displayOptions">showCustom</item>
    <item name="android:background">#88000000</item>
  </style>

value-v19 / styles.xml

 <style name="Theme.WallpaperCropper" parent="@android:style/Theme.DeviceDefault">
    <item name="android:actionBarStyle">@style/WallpaperCropperActionBar</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowActionBarOverlay">true</item>
    <item name="android:windowTranslucentNavigation">true</item>
  </style>

  <style name="Theme" parent="@android:style/Theme.DeviceDefault.Wallpaper.NoTitleBar">
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowTranslucentNavigation">true</item>
  </style>

EDIT: il existe un meilleur moyen de le faire, qui fonctionne également sur la bibliothèque de support. Ajoutez simplement cette ligne de code à la place de ce que j'ai écrit ci-dessus:

getSupportActionBar().setDisplayShowCustomEnabled(true);

1
2018-06-07 21:33