¿Cómo mostrar una vista personalizada en ActionBar?

Quiero mostrar la búsqueda personalizada en la barra de acciones (estoy usando ActionBarSherlock para eso).

Lo tengo:

enter image description here

Pero quiero que el diseño personalizado (campo de texto de edición) ocupe todo el ancho disponible.

Implementé el diseño personalizado como se sugiere aquí .

Hay mi diseño personalizado search.xml :

        

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

¿Cómo puedo hacer que el diseño personalizado ocupe todo el ancho disponible de actionBar ?

Ayuda por favor.

Hay un truco para esto. Todo lo que tienes que hacer es usar RelativeLayout lugar de LinearLayout como contenedor principal. Es importante tener android:layout_gravity="fill_horizontal" establecido para ello. Deberias hacer eso.

Luché con esto yo mismo y probé la respuesta de Tomik. Sin embargo, esto no convirtió el diseño en ancho completo disponible al inicio, solo cuando agrega algo a la vista.

Tendrá que establecer los LayoutParams.FILL_PARENT al agregar la vista:

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

De esta forma llena por completo el espacio disponible. (Puede que necesite usar la solución de Tomik también).

Las respuestas de Tomik y Peterdk funcionan cuando desea que su vista personalizada ocupe toda la barra de acciones, incluso ocultando el título nativo.

Pero si desea que su vista personalizada viva junto al título (y complete todo el espacio restante una vez que se muestre el título), entonces le recomiendo la excelente respuesta del usuario Desarrollador de Android aquí:

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

Su código en el fondo funcionó perfectamente para mí.

Así es como funcionó para mí (de las respuestas anteriores se mostraba tanto el título predeterminado como mi vista personalizada también).

 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. 

Lo que noté es que tanto setCustomView(view) como setCustomView(view,params) la vista width = match / fill parent. setDisplayShowCustomEnabled (boolean showCustom)

Por ejemplo, puede definir un archivo de diseño que contenga un elemento EditText.

    

tu puedes hacer

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

Hay un ejemplo en la aplicación de lanzamiento de Android (que he creado una biblioteca, aquí) dentro de la clase que maneja la selección de fondos de pantalla (“WallpaperPickerActivity”).

El ejemplo muestra que necesita establecer un tema personalizado para que esto funcione. Tristemente, esto funcionó para mí solo usando el marco normal, y no el de la biblioteca de soporte.

Aquí están los temas:

styles.xml

     

value-v19 / styles.xml

    

EDITAR: hay una mejor manera de hacerlo, que también funciona en la biblioteca de soporte. Simplemente agregue esta línea de código en lugar de lo que he escrito arriba:

 getSupportActionBar().setDisplayShowCustomEnabled(true);