Saturday 15 March 2014

android - No ActionBar in PreferenceActivity after upgrade to Support Library v21 -



android - No ActionBar in PreferenceActivity after upgrade to Support Library v21 -

after upgraded back upwards library v21 actionbar in preferenceactivity gone.

did miss attributes in theme activate again? had similar problem a black actionbar.

i tried add together little hackish adding toolbar root layout, did not work expected.

please find github repo: here

very similar own code added xml allow set title:

continuing utilize preferenceactivity:

settings_toolbar.xml :

<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.toolbar xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/toolbar" app:theme="@style/themeoverlay.appcompat.dark.actionbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:minheight="?attr/actionbarsize" app:navigationcontentdescription="@string/abc_action_bar_up_description" android:background="?attr/colorprimary" app:navigationicon="?attr/homeasupindicator" app:title="@string/action_settings" />

settingsactivity.java :

public class settingsactivity extends preferenceactivity { @override protected void onpostcreate(bundle savedinstancestate) { super.onpostcreate(savedinstancestate); linearlayout root = (linearlayout)findviewbyid(android.r.id.list).getparent().getparent().getparent(); toolbar bar = (toolbar) layoutinflater.from(this).inflate(r.layout.settings_toolbar, root, false); root.addview(bar, 0); // insert @ top bar.setnavigationonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { finish(); } }); } }

result :

update (gingerbread compatibility) :

as pointed out here, gingerbread devices returning nullpointerexception on line:

linearlayout root = (linearlayout)findviewbyid(android.r.id.list).getparent().getparent().getparent(); fix:

settingsactivity.java :

public class settingsactivity extends preferenceactivity { @override protected void onpostcreate(bundle savedinstancestate) { super.onpostcreate(savedinstancestate); toolbar bar; if (build.version.sdk_int >= build.version_codes.jelly_bean) { linearlayout root = (linearlayout) findviewbyid(android.r.id.list).getparent().getparent().getparent(); bar = (toolbar) layoutinflater.from(this).inflate(r.layout.settings_toolbar, root, false); root.addview(bar, 0); // insert @ top } else { viewgroup root = (viewgroup) findviewbyid(android.r.id.content); listview content = (listview) root.getchildat(0); root.removeallviews(); bar = (toolbar) layoutinflater.from(this).inflate(r.layout.settings_toolbar, root, false); int height; typedvalue tv = new typedvalue(); if (gettheme().resolveattribute(r.attr.actionbarsize, tv, true)) { height = typedvalue.complextodimensionpixelsize(tv.data, getresources().getdisplaymetrics()); }else{ height = bar.getheight(); } content.setpadding(0, height, 0, 0); root.addview(content); root.addview(bar); } bar.setnavigationonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { finish(); } }); } }

any issues above allow me know!

update 2: tinting workaround

as pointed out in many dev notes preferenceactivity not back upwards tinting of elements, utilising few internal classes can accomplish this. until these classes removed. (works using appcompat support-v7 v21.0.3).

add next imports:

import android.support.v7.internal.widget.tintcheckbox; import android.support.v7.internal.widget.tintcheckedtextview; import android.support.v7.internal.widget.tintedittext; import android.support.v7.internal.widget.tintradiobutton; import android.support.v7.internal.widget.tintspinner;

then override oncreateview method:

@override public view oncreateview(string name, context context, attributeset attrs) { // allow super seek , create view first final view result = super.oncreateview(name, context, attrs); if (result != null) { homecoming result; } if (build.version.sdk_int < build.version_codes.lollipop) { // if we're running pre-l, need 'inject' our tint aware views in place of // standard framework versions switch (name) { case "edittext": homecoming new tintedittext(this, attrs); case "spinner": homecoming new tintspinner(this, attrs); case "checkbox": homecoming new tintcheckbox(this, attrs); case "radiobutton": homecoming new tintradiobutton(this, attrs); case "checkedtextview": homecoming new tintcheckedtextview(this, attrs); } } homecoming null; }

result:

appcompat 22.1

appcompat 22.1 introduced new tinted elements, meaning there no longer need utilise internal classes accomplish same effect lastly update. instead follow (still overriding oncreateview):

@override public view oncreateview(string name, context context, attributeset attrs) { // allow super seek , create view first final view result = super.oncreateview(name, context, attrs); if (result != null) { homecoming result; } if (build.version.sdk_int >= build.version_codes.jelly_bean) { // if we're running pre-l, need 'inject' our tint aware views in place of // standard framework versions switch (name) { case "edittext": homecoming new appcompatedittext(this, attrs); case "spinner": homecoming new appcompatspinner(this, attrs); case "checkbox": homecoming new appcompatcheckbox(this, attrs); case "radiobutton": homecoming new appcompatradiobutton(this, attrs); case "checkedtextview": homecoming new appcompatcheckedtextview(this, attrs); } } homecoming null; }

nested preference screens

a lot of people experiencing issues including toolbar in nested <preferencescreen />s however, have found solution!! - after lot of trial , error!

add next settingsactivity:

@suppresswarnings("deprecation") @override public boolean onpreferencetreeclick(preferencescreen preferencescreen, preference preference) { super.onpreferencetreeclick(preferencescreen, preference); // if user has clicked on preference screen, set screen if (preference instanceof preferencescreen) { setupnestedscreen((preferencescreen) preference); } homecoming false; } public void setupnestedscreen(preferencescreen preferencescreen) { final dialog dialog = preferencescreen.getdialog(); toolbar bar; if (build.version.sdk_int >= build.version_codes.ice_cream_sandwich) { linearlayout root = (linearlayout) dialog.findviewbyid(android.r.id.list).getparent(); bar = (toolbar) layoutinflater.from(this).inflate(r.layout.settings_toolbar, root, false); root.addview(bar, 0); // insert @ top } else { viewgroup root = (viewgroup) dialog.findviewbyid(android.r.id.content); listview content = (listview) root.getchildat(0); root.removeallviews(); bar = (toolbar) layoutinflater.from(this).inflate(r.layout.settings_toolbar, root, false); int height; typedvalue tv = new typedvalue(); if (gettheme().resolveattribute(r.attr.actionbarsize, tv, true)) { height = typedvalue.complextodimensionpixelsize(tv.data, getresources().getdisplaymetrics()); }else{ height = bar.getheight(); } content.setpadding(0, height, 0, 0); root.addview(content); root.addview(bar); } bar.settitle(preferencescreen.gettitle()); bar.setnavigationonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { dialog.dismiss(); } }); }

the reason preferencescreen's such pain because based wrapper dialog, need capture dialog layout add together toolbar it.

toolbar shadow

by design importing toolbar not allow elevation , shadowing in pre-v21 devices, if have elevation on toolbar need wrap in appbarlayout:

`settings_toolbar.xml :

<android.support.design.widget.appbarlayout android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.toolbar .../> </android.support.design.widget.appbarlayout>

not forgetting add together add design back upwards library dependency in build.gradle file:

compile 'com.android.support:support-v4:22.2.0' compile 'com.android.support:appcompat-v7:22.2.0' compile 'com.android.support:design:22.2.0' android 6.0

i have investigated reported overlapping issue , cannot reproduce issue.

the total code in utilize above produces following:

if missing please allow me know via this repo , investigate.

android android-support-library preferenceactivity android-5.0-lollipop

No comments:

Post a Comment