Android Toolbar: small title text in landscape mode
I tried to set android:titleTextAppearance
of the toolbar but the style wasn't being applied. Then I realized I'm using the AppCompat theme so I used app:titleTextAppearance
and the style is now being applied. It looks like the small letters in landscape are a problem in the built-in AppCompat.Toolbar.Title
style itself so I overrode it to set the font size manually. The final code:
Toolbar XML:
<android.support.v7.widget.Toolbar
android:id="@+id/main_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:titleTextAppearance="@style/ToolbarTitle"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
Toolbar Style:
<style name="ToolbarTitle" parent="@style/TextAppearance.Widget.AppCompat.Toolbar.Title">
<item name="android:textSize">20sp</item>
</style>
Why title size not changed after rotation?
The style of the title is in a configuration-specific XML file. If you don't recreate the view on configuration change, it will just stay as it is.
Solution: recreate the Activity on configuration change, or use a Fragment with setRetainInstance(true) which will be preserved while its view is re-created.
How to change the toolbar text size?
Use app:titleTextAppearance
:
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="?actionBarSize"
android:id="@+id/toolbar"
app:titleTextAppearance="@style/Toolbar.TitleText" />
and override the default title size in a custom style:
<style name="Toolbar.TitleText" parent="TextAppearance.Widget.AppCompat.Toolbar.Title">
<item name="android:textSize">18sp</item>
</style>
Result:
Toolbar title disappearing when changing orientation in collapsed state
You can check the state of AppBarLayout on configuration change(orientation), store it. Then you can set that state for the AppBarLayout after configuration change applied.
public class CheeseDetailActivity extends AppCompatActivity {
public static final String EXTRA_NAME = "cheese_name";
AppBarLayout appBarLayout;
boolean isCollapsed = false;
//state change listener
AppBarLayout.OnOffsetChangedListener toolbarStateListener = new AppBarLayout.OnOffsetChangedListener() {
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
if (verticalOffset == 0) {
// Collapsed
isCollapsed = true;
} else {
// Not collapsed
isCollapsed = false;
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
Intent intent = getIntent();
final String cheeseName = intent.getStringExtra(EXTRA_NAME);
final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
CollapsingToolbarLayout collapsingToolbar =
(CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar);
collapsingToolbar.setTitle(cheeseName);
//getting app bar layout
appBarLayout = (AppBarLayout) findViewById(R.id.appbar);
//set listener to listen state change of app bar layout
appBarLayout.addOnOffsetChangedListener(toolbarStateListener);
loadBackdrop();
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
//save state on orientation change
savedInstanceState.putBoolean("isCollapsed", isCollapsed);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
//get state on orientation change
isCollapsed = savedInstanceState.getBoolean("isCollapsed");
}
@Override
protected void onResume() {
super.onResume();
//set state of app bar layout
appBarLayout.setExpanded(isCollapsed);
}
private void loadBackdrop() {
final ImageView imageView = (ImageView) findViewById(R.id.backdrop);
Glide.with(this).load(Cheeses.getRandomCheeseDrawable()).centerCrop().into(imageView);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.sample_actions, menu);
return true;
}
}
I have edited CheeseDetailActivity in CheeseSquare repository.
Support Action Bar not applying my style?
You need to use
<item name="background">@drawable/ab_solid</item>
<item name="titleTextStyle">@style/my_title_style</item>
for support library compatibility into your style.
Read Styling the Action Bar, section "For Android 2.1 and higher
". Where it is given that you need to use two entries like
<style name="CustomActionBarTheme"
parent="@style/Theme.AppCompat.Light.DarkActionBar">
<item name="android:actionBarStyle">@style/MyActionBar</item>
<!-- Support library compatibility -->
<item name="actionBarStyle">@style/MyActionBar</item>
</style>
So your complete style would be
<style name="Widget.MyTheme.ActionBar" parent="@style/Widget.AppCompat.ActionBar.Solid">
<item name="android:background">@drawable/ab_solid</item>
<item name="android:titleTextStyle">@style/my_title_style</item>
<item name="background">@drawable/ab_solid</item>
<item name="titleTextStyle">@style/my_title_style</item>
</style>
What is the recommended material design toolbar height in landscape
The Toolbar
is a generic component that can be added to any part of your UI - when used as the primary action bar for branding, navigation, and actions, it is called an App Bar.
From the metrics on the App Bar, the correct heights are:
- Mobile Landscape: 48dp
- Mobile Portrait: 56dp
- Tablet/Desktop: 64dp
Related Topics
Calledfromwrongthreadexception
Java.Lang.Noclassdeffounderror: Org.Ksoap2.Serialization.Soapobject
"File Not Found" Exception in Dexdebug Task of Build
Android Home Screen Widget (Icon, Label - Style)
Recycle-View Inflating Different Row :- Getting Exception While Binding the Data
How to Display Map (Google) on a Phonegap Android Application
How to Calculate Phone's Movement in the Vertical Direction from Rest
How to Add Code Obfuscation for My Android Application
How to Detect When the Notification/System Bar Is Opened
Could Not Launch Emulator in Android Studio
Set Loadurltimeoutvalue on Webview
Custom Font in Android Listview
How to Show Text in Android System Status Bar
How to Call Stopservice() Method of Service Class from the Calling Activity Class