android 5.0 lollipop - sgoliver - ¿Cómo agregar botones como actualizar y buscar en ToolBar en Android?
toolbar android sgoliver (4)
He creado una ToolBar, pero cuando agrego elementos de menú en menu.xml, siempre aparece como un desbordamiento. ¿Cómo lo agrego por separado? Además, el título se muestra en el centro (verticalmente), ¿cómo lo muestro en la parte superior?
menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.toolbar.MainActivity" >
<item android:id="@+id/action_search"
android:icon="@drawable/ic_launcher"
android:title="@string/action_search"
android:showAsAction="ifRoom"
android:orderInCategory="1"
android:menuCategory="secondary"/>
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:title="@string/action_settings"
app:showAsAction="never"/>
</menu>
MainActivity.java
package com.example.toolbar;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.Toolbar;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
setSupportActionBar(toolbar);
// toolbar.setNavigationIcon(R.drawable.back);
toolbar.setLogo(R.drawable.ic_launcher);
//toolbar.setTitle("Title");
// toolbar.setSubtitle("Subtitle");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
activity_main.xml
<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="com.example.toolbar.MainActivity" >
<android.support.v7.widget.Toolbar
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/my_awesome_toolbar"
android:layout_width="fill_parent"
android:layout_height="128dp"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
app:theme="@style/ActionBarThemeOverlay">
</android.support.v7.widget.Toolbar>
</RelativeLayout>
Agregue esta línea en la parte superior:
"xmlns:app="http://schemas.android.com/apk/res-auto"
y luego usa:
app:showasaction="ifroom"
Intenta hacer esto:
getSupportActionBar().setDisplayShowTitleEnabled(false);
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
getSupportActionBar().setDisplayShowTitleEnabled(false);
y si creó su barra de herramientas personalizada (que supongo que hizo), puede usar la forma más sencilla posible para hacer esto:
toolbarTitle = (TextView)findViewById(R.id.toolbar_title);
toolbarSubTitle = (TextView)findViewById(R.id.toolbar_subtitle);
toolbarTitle.setText("Title");
toolbarSubTitle.setText("Subtitle");
Lo mismo ocurre con cualquier otra vista que coloque en su barra de herramientas. Espero eso ayude.
OK, obtuve los íconos porque escribí en menu.xml android:showAsAction="ifRoom"
lugar de app:showAsAction="ifRoom"
porque estoy usando la biblioteca v7.
Sin embargo, el título viene en el centro de la barra de herramientas extendida. ¿Cómo hacer que aparezca en la parte superior?
Para controlar la ubicación del título, puede establecer una fuente personalizada como se explica aquí (mediante twaddington): Link
Luego, para reubicar la posición del texto, en updateMeasureState()
agregaría p.baselineShift += (int) (p.ascent() * R);
De manera similar, en updateDrawState()
agrega tp.baselineShift += (int) (tp.ascent() * R);
Donde R es doble entre -1 y 1.