Last active
September 13, 2017 12:06
-
-
Save StelianMorariu/fcc4db7f677660316a8f to your computer and use it in GitHub Desktop.
AppCompatPreferenceActivity created based on accepted answer from http://stackoverflow.com/questions/26509180/no-actionbar-in-preferenceactivity-after-upgrade-to-support-library-v21
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.owncloud.android.ui.activity; | |
import android.app.Dialog; | |
import android.content.Context; | |
import android.content.res.Configuration; | |
import android.os.Build; | |
import android.os.Bundle; | |
import android.preference.Preference; | |
import android.preference.PreferenceActivity; | |
import android.preference.PreferenceScreen; | |
import android.support.annotation.LayoutRes; | |
import android.support.annotation.Nullable; | |
import android.support.v7.app.ActionBar; | |
import android.support.v7.app.AppCompatDelegate; | |
import android.support.v7.widget.AppCompatCheckBox; | |
import android.support.v7.widget.AppCompatCheckedTextView; | |
import android.support.v7.widget.AppCompatEditText; | |
import android.support.v7.widget.AppCompatRadioButton; | |
import android.support.v7.widget.AppCompatSpinner; | |
import android.support.v7.widget.Toolbar; | |
import android.util.AttributeSet; | |
import android.util.TypedValue; | |
import android.view.LayoutInflater; | |
import android.view.MenuInflater; | |
import android.view.View; | |
import android.view.ViewGroup; | |
import android.widget.LinearLayout; | |
import android.widget.ListView; | |
import com.owncloud.android.R; | |
/** | |
* A {@link android.preference.PreferenceActivity} which implements and proxies the necessary calls | |
* to be used with AppCompat. | |
* <p/> | |
* This technique can be used with an {@link android.app.Activity} class, not just | |
* {@link android.preference.PreferenceActivity}. | |
*/ | |
public abstract class AppCompatPreferenceActivity extends PreferenceActivity { | |
@Override | |
public View onCreateView(String name, Context context, AttributeSet attrs) { | |
// Allow super to try and create a view first | |
final View result = super.onCreateView(name, context, attrs); | |
if (result != null) { | |
return result; | |
} | |
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { | |
// If we're running pre-L, we need to 'inject' our tint aware Views in place of the | |
// standard framework versions | |
switch (name) { | |
case "EditText": | |
return new AppCompatEditText(this, attrs); | |
case "Spinner": | |
return new AppCompatSpinner(this, attrs); | |
case "CheckBox": | |
return new AppCompatCheckBox(this, attrs); | |
case "RadioButton": | |
return new AppCompatRadioButton(this, attrs); | |
case "CheckedTextView": | |
return new AppCompatCheckedTextView(this, attrs); | |
} | |
} | |
return null; | |
} | |
@Override | |
protected void onPostCreate(Bundle savedInstanceState) { | |
super.onPostCreate(savedInstanceState); | |
Toolbar bar; | |
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { | |
LinearLayout root = (LinearLayout) findViewById(android.R.id.list).getParent().getParent().getParent(); | |
final View view = LayoutInflater.from(this).inflate(R.layout.settings_toolbar, root, false); | |
bar = (Toolbar) view.findViewById(R.id.toolbar); | |
root.addView(bar, 0); // insert at 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(); | |
} | |
}); | |
} | |
@SuppressWarnings("deprecation") | |
@Override | |
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { | |
super.onPreferenceTreeClick(preferenceScreen, preference); | |
// If the user has clicked on a preference screen, set up the screen | |
if (preference instanceof PreferenceScreen) { | |
setUpNestedScreen((PreferenceScreen) preference); | |
} | |
return 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 at 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(); | |
} | |
}); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="utf-8"?> | |
<android.support.design.widget.AppBarLayout 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="wrap_content"> | |
<android.support.v7.widget.Toolbar | |
android:id="@+id/toolbar" | |
android:layout_width="match_parent" | |
android:layout_height="wrap_content" | |
android:background="?attr/colorPrimary" | |
android:minHeight="?attr/actionBarSize" | |
app:navigationContentDescription="@string/abc_action_bar_up_description" | |
app:navigationIcon="?attr/homeAsUpIndicator" | |
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" | |
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" | |
app:title="@string/actionbar_settings" /> | |
</android.support.design.widget.AppBarLayout> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment