- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我经历了How to add toolbars to AppCompatPreferenceActivity?
我正在使用 appcompat-v7:23.0.1
和 support-v4:23.0.1
在使用 AppCompayPreferenceActivity
之前,我的 PreferenceActivity
在没有工具栏的情况下看起来如下。
public class JStockPreferenceActivity extends PreferenceActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
// Display the fragment as the main content.
JStockPreferenceFragment jStockPreferenceFragment = JStockPreferenceFragment.newInstance();
jStockPreferenceFragment.setArguments(this.getIntent().getExtras());
this.getFragmentManager().beginTransaction().replace(android.R.id.content, jStockPreferenceFragment).commit();
}
}
使用AppCompayPreferenceActivity
后,加上一些Toolbar
初始化代码,结果如下
结果不如预期:-
Toolbar
与 PreferenceFragment
重叠Toolbar
时,该事件将被 PreferenceFragment
消耗。这意味着,当您触摸工具栏时,将改为触摸“表格标题”首选项。public class JStockPreferenceActivity extends AppCompatPreferenceActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
// Display the fragment as the main content.
JStockPreferenceFragment jStockPreferenceFragment = JStockPreferenceFragment.newInstance();
jStockPreferenceFragment.setArguments(this.getIntent().getExtras());
this.getFragmentManager().beginTransaction().replace(android.R.id.content, jStockPreferenceFragment).commit();
}
initToolbar();
}
private void initToolbar() {
Toolbar toolbar;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
ViewGroup root = (ViewGroup) findViewById(android.R.id.list).getParent().getParent().getParent();
toolbar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.toolbar, root, false);
root.addView(toolbar, 0);
} else {
toolbar = null;
}
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
}
我的工具栏是
<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"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:minHeight="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:elevation="4dp"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" >
<!-- android:elevation="4dp" is used due to http://www.google.com/design/spec/what-is-material/elevation-shadows.html#elevation-shadows-elevation-android- -->
</android.support.v7.widget.Toolbar>
我想知道,我做错了什么,导致 Toolbar
与 PreferenceFragment
重叠
最佳答案
经过一些研究并从 Ian Lake 获得建议,我设法让它工作了
AppCompatPreferenceActivity
更改为 AppCompatActivity
+PreferenceFragmentCompat
以下解决方案适用于 API 10 及更高版本。
public class JStockPreferenceActivity extends AppCompatActivity {
@SuppressWarnings("deprecation")
@SuppressLint("NewApi")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.jstock_preference_activity);
initToolbar();
if (savedInstanceState == null) {
// Display the fragment as the main content.
JStockPreferenceFragment jStockPreferenceFragment = JStockPreferenceFragment.newInstance();
jStockPreferenceFragment.setArguments(this.getIntent().getExtras());
this.getSupportFragmentManager().beginTransaction().replace(R.id.content, jStockPreferenceFragment).commit();
}
}
public class JStockPreferenceFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener, PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback {
public static JStockPreferenceFragment newInstance() {
return new JStockPreferenceFragment();
}
但是,这样做有一个缺点。您之前的自定义 DialogPreference
不再有效。要解决这个问题,您需要
DialogPreference
替换为 PreferenceDialogFragmentCompat
。DialogPreference
替换为 ListPreference
。 (我不确定 ListPreference
作为替换是否是正确的方法。无论如何它都有效)PreferenceFragmentCompat
的 onPreferenceDisplayDialog
中手动显示 PreferenceDialogFragmentCompat
。public class JStockPreferenceFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener, PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback {
public static JStockPreferenceFragment newInstance() {
return new JStockPreferenceFragment();
}
////////////////////////////////////////////////////////////////////////////////////////////////
// Showing custom dialog preference.
private void showPreferenceDialogFragmentCompat(PreferenceDialogFragmentCompat preferenceDialogFragmentCompat) {
preferenceDialogFragmentCompat.setTargetFragment(this, 0);
preferenceDialogFragmentCompat.show(this.getFragmentManager(), "android.support.v7.preference.PreferenceFragment.DIALOG");
}
private void showCurrencySymbolPreferenceDialogFragmentCompat(Preference preference) {
CurrencySymbolPreferenceDialogFragmentCompat currencySymbolPreferenceDialogFragmentCompat = CurrencySymbolPreferenceDialogFragmentCompat.newInstance(preference.getKey());
showPreferenceDialogFragmentCompat(currencySymbolPreferenceDialogFragmentCompat);
}
// Showing custom dialog preference.
////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////
// Callback when we are using custom dialog preference.
@Override
public Fragment getCallbackFragment() {
return this;
}
@Override
public boolean onPreferenceDisplayDialog(PreferenceFragmentCompat preferenceFragmentCompat, Preference preference) {
final String key = preference.getKey();
if (_CURRENCY_SYMBOL_OPTIONS.equals(key)) {
showCurrencySymbolPreferenceDialogFragmentCompat(preference);
return true;
}
return false;
}
// Callback when we are using custom dialog preference.
////////////////////////////////////////////////////////////////////////////////////////////////
public class CurrencySymbolPreferenceDialogFragmentCompat extends PreferenceDialogFragmentCompat {
public CurrencySymbolPreferenceDialogFragmentCompat() {
}
public static CurrencySymbolPreferenceDialogFragmentCompat newInstance(String key) {
CurrencySymbolPreferenceDialogFragmentCompat fragment = new CurrencySymbolPreferenceDialogFragmentCompat();
Bundle b = new Bundle(1);
b.putString("key", key);
fragment.setArguments(b);
return fragment;
}
@Override
public void onDialogClosed(boolean positiveResult) {
if (positiveResult) {
...
this.getPreference().setSummary(getSummary());
...
}
}
}
<android.support.v7.preference.ListPreference
android:title="@string/preference_currency_symbol_title"
android:key="_CURRENCY_SYMBOL_OPTIONS" />
请注意,您需要在主题中添加以下项目。
<item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
但是,主题还不完美 - PreferenceFragmentCompat requires preferenceTheme to be set
这是一个已知问题:https://code.google.com/p/android/issues/detail?id=183376
有建议的解决方法 https://stackoverflow.com/a/32108439/72437但是,解决方法仅适用于 v14 及更高版本,不适用于 v7 及更高版本。
关于android - 通过 AppCompatPreferenceActivity 添加 toolbar 到 PreferenceActivity 导致重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32953166/
在我的配置 Activity 中,我需要创建一个首选项屏幕,顶部有一个固定 View ,显示页面中配置的内容的预览。我不想更改主首选项屏幕(我已经有一个单独的 Activity )我想要一个不同的“嵌
我有这样的偏好选项: public class Opciones extends PreferenceActivity { @Override public void onCreate
我正在尝试使用以下代码在首选项 Activity 中设置工具栏。它确实显示了工具栏,但它覆盖了首选项列表。 Here来 self 的应用程序的屏幕截图链接我正在做这个 bcz 我正在运行时更改样式主题
我用谷歌搜索但没有找到显示 android 中 PreferenceActivities 生命周期的等效流程图。这样的流程图存在吗?显示基本 Activity 生命周期的那个对理解 Activity
java.lang.RuntimeException: Unable to start activity ComponentInfo{org.emphie.fod/org.emphie.fod.pre
使用 Android 注释。我的偏好: @SharedPref(value = SharedPref.Scope.APPLICATION_DEFAULT) public interface MyPre
我是 android 开发的新手,我正在尝试弄清楚如何将用户带到我的 PreferenceActivity。我已经创建了一个具有相应布局的 Preferences 类,但是我无法弄清楚如何在没有物理菜
我最近接触了 PreferenceActivity,我想改变我处理与 xml 中定义的 EditTextPreference 交互的方式。 我已经在样板文件覆盖 onListItemClick( 的地
我试图在单击后退按钮后关闭首选项 Activity ..但是当我按下它然后单击多任务按钮时,我看到为我的应用程序打开了两个 Activity ,一个是我当前正在使用的 Activity ,另一个是 p
我读了http://developer.android.com/reference/android/app/Activity.html但我对 PreferenceActivity 生命周期有疑问: P
我正在编写一个带有 PreferenceFragment 的 PreferenceActivity,当设备的方向发生变化时(即从横向到纵向),将抛出一个 InstantiationException反
我看到一些应用程序在某些应用程序的设置中有弹出窗口(如果您在 Google Play 的设置中单击“开源许可证”)和搜索栏(通常用于音量和字体大小)。 这些是如何实现的?在res/xml/pref.x
我正在实现 PreferenceActivity,它会要求用户输入用户名和密码。我将使用 EditTextPreference 作为用户名,但我需要什么元素才能有“密码输入”,这将隐藏输入的数据(即更
在我的 android 应用程序中,我想制作一个反馈对话框,该对话框将在应用程序第二次启动时显示。我怎样才能做到这一点 ?我可以通过 PreferenceActivity 中的变量来完成吗?如果pre
我最重要的问题是:在 Android 中 PreferenceActivity , 我怎样才能写一个 OnClickListener当我浏览 PreferenceScreen 时,这将具有与按 And
我有一个 MainActivity 和一个从该 Activity 调用的 PreferenceActivity。我还有一项服务正在运行以查询这些首选项。 当我打印这些值时。我明白了: D/pref_s
在我的应用程序中,我想在我的应用程序中使用特定首选项时显示警告。我试过使用 PreferenceActivity.onPreferenceTreeClick 和 onPreferenceClickLi
我有这样一段代码:)我想编辑我的自定义首选项布局的文本属性。但是从 getView 函数对对象所做的任何更改都不会影响首选项屏幕中的实际列表。有任何想法吗?我知道我不能扩展 PreferenceScr
我有一个扩展 Preference 的自定义类,我将它与 PreferenceActivity 结合使用。 当我尝试调整我的 Preference 正在使用的布局中的高度(使用静态 layout_he
在PreferenceActivity中使用一个preference文件(而不是默认的共享preferences)的方法如下: public class MyPreferencesActivity e
我是一名优秀的程序员,十分优秀!