कृपया GitHub रेपो: यहां देखें
बहुत ही अपने कोड के समान है लेकिन सेट शीर्षक के लिए अनुमति देने के लिए xml जोड़ा गया है:
उपयोग करने के लिए जारी 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);
bar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
}
Result :
अद्यतन (जिंजरब्रेड संगतता):
जैसा कि यहां बताया गया है , जिंजरब्रेड डिवाइस इस लाइन पर NullPointerException वापस कर रहे हैं:
LinearLayout root = (LinearLayout)findViewById(android.R.id.list).getParent().getParent().getParent();
ठीक कर:
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);
} 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();
}
});
}
}
ऊपर के साथ किसी भी मुद्दे मुझे पता है!
अद्यतन 2: टंकण कार्य
जैसा कि कई देव नोटों में बताया गया है कि PreferenceActivity
तत्वों की टिनिंग का समर्थन नहीं करता है, हालांकि कुछ आंतरिक वर्गों का उपयोग करके आप इसे प्राप्त कर सकते हैं। यह तब तक है जब तक इन वर्गों को हटा नहीं दिया जाता। (AppCompat support-v7 v21.0.3 का उपयोग कर काम करता है)।
निम्नलिखित आयात जोड़ें:
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;
फिर onCreateView
विधि को ओवरराइड करें :
@Override
public View onCreateView(String name, Context context, AttributeSet attrs) {
final View result = super.onCreateView(name, context, attrs);
if (result != null) {
return result;
}
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
switch (name) {
case "EditText":
return new TintEditText(this, attrs);
case "Spinner":
return new TintSpinner(this, attrs);
case "CheckBox":
return new TintCheckBox(this, attrs);
case "RadioButton":
return new TintRadioButton(this, attrs);
case "CheckedTextView":
return new TintCheckedTextView(this, attrs);
}
}
return null;
}
Result:
AppCompat 22.1
AppCompat 22.1 ने नए टिंटेड तत्वों को पेश किया, जिसका अर्थ है कि अंतिम अद्यतन के समान प्रभाव प्राप्त करने के लिए आंतरिक कक्षाओं का उपयोग करने की आवश्यकता नहीं है। इसके बजाय इसका अनुसरण करें (अभी भी ओवरराइड कर रहे हैं onCreateView
):
@Override
public View onCreateView(String name, Context context, AttributeSet attrs) {
final View result = super.onCreateView(name, context, attrs);
if (result != null) {
return result;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
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;
}
NESTED PREFERENCE SCREENS
बहुत से लोग नेस्टेड <PreferenceScreen />
एस में टूलबार सहित मुद्दों का सामना कर रहे हैं , हालांकि, मुझे एक समाधान मिल गया है !! - बहुत परीक्षण और त्रुटि के बाद!
निम्नलिखित को अपने में जोड़ें SettingsActivity
:
@SuppressWarnings("deprecation")
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
super.onPreferenceTreeClick(preferenceScreen, preference);
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);
} 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();
}
});
}
कारण यह है कि PreferenceScreen
इस तरह के एक दर्द है क्योंकि वे एक आवरण संवाद के रूप में आधारित हैं, इसलिए हमें टूलबार को इसमें जोड़ने के लिए संवाद लेआउट पर कब्जा करने की आवश्यकता है।
टूलबार छाया
डिज़ाइन आयात करके Toolbar
पूर्व-v21 उपकरणों में ऊँचाई और छाया देने की अनुमति नहीं देता है, इसलिए यदि आप इसे अपने ऊपर उठाना चाहते हैं, तो आपको Toolbar
इसे इसमें लपेटना होगा AppBarLayout
:
`settings_toolbar.xml:
<android.support.design.widget.AppBarLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.Toolbar
.../>
</android.support.design.widget.AppBarLayout>
build.gradle
फ़ाइल में निर्भरता के रूप में डिज़ाइन समर्थन लाइब्रेरी जोड़ना न भूलें :
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
मैंने रिपोर्ट की गई ओवरलैपिंग समस्या की जांच की है और मैं इस मुद्दे को पुन: पेश नहीं कर सकता।
उपरोक्त के रूप में उपयोग में पूर्ण कोड निम्नलिखित उत्पन्न करता है:
अगर मुझे कुछ याद आ रहा है तो कृपया मुझे इस रेपो के माध्यम से बताएं और मैं जांच करूंगा।