- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个很奇怪的问题。当我在我的设置- Activity 中滚动时,一些复选框在不再显示时会发生变化。例如:我取消选中广告复选框,然后向下滚动,当复选框完全消失时,复选框会重置。只有当我取消选中默认值没有任何影响的复选框时才会发生这种情况。
我的 Activity :
public class SettingsActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener {
/**
* Determines whether to always show the simplified settings UI, where
* settings are presented in a single list. When false, settings are shown
* as a master/detail two-pane view on tablets. When true, a single pane is
* shown on tablets.
*/
private static final boolean ALWAYS_SIMPLE_PREFS = false;
private SharedPreferences prefs;
private Tracker mTracker;
private void analytics() {
if(prefs.getBoolean(Tags.PREF_GOOGLEANALYTICS, true)) {
// Obtain the shared Tracker instance.
AnalyticsApplication application = (AnalyticsApplication) getApplication();
mTracker = application.getDefaultTracker();
mTracker.setScreenName("SettingsActivity");
mTracker.send(new HitBuilders.ScreenViewBuilder().build());
}
}
private void analytics(String category, String action) {
if(prefs.getBoolean(Tags.PREF_GOOGLEANALYTICS, true)) {
if (mTracker == null) {
AnalyticsApplication application = (AnalyticsApplication) getApplication();
mTracker = application.getDefaultTracker();
}
mTracker.send(new HitBuilders.EventBuilder()
.setCategory(category)
.setAction(action)
.build());
}
}
private void setLocale(String lang) {
/*Locale myLocale = new Locale(lang);
Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.locale = myLocale;
res.updateConfiguration(conf, dm);*/
Locale locale = new Locale(lang);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config,
getBaseContext().getResources().getDisplayMetrics());
Intent refresh = new Intent(this, MainActivity.class);
startActivity(refresh);
finish();
}
@Override
protected void onResume() {
super.onResume();
prefs.registerOnSharedPreferenceChangeListener(this);
}
@Override
protected void onPause() {
super.onPause();
prefs.unregisterOnSharedPreferenceChangeListener(this);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
prefs = PreferenceManager.getDefaultSharedPreferences(this);
analytics();
Toolbar bar;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
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 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();
}
});
setupSimplePreferencesScreen();
}
/**
* Shows the simplified settings UI if the device configuration if the
* device configuration dictates that a simplified, single-pane UI should be
* shown.
*/
private void setupSimplePreferencesScreen() {
if (!isSimplePreferences(this)) {
return;
}
// In the simplified UI, fragments are not used at all and we instead
// use the older PreferenceActivity APIs.
// Add 'general' preferences.
addPreferencesFromResource(R.xml.pref_general);
// Add 'notifications' preferences, and a corresponding header.
PreferenceCategory fakeHeader = new PreferenceCategory(this);
fakeHeader.setTitle(getResources().getString(R.string.pref_notifications));
getPreferenceScreen().addPreference(fakeHeader);
addPreferencesFromResource(R.xml.pref_notification);
PreferenceCategory fakeHeaderAudio = new PreferenceCategory(this);
fakeHeaderAudio.setTitle(getResources().getString(R.string.pref_audio));
getPreferenceScreen().addPreference(fakeHeaderAudio);
addPreferencesFromResource(R.xml.pref_audio);
// Bind the summaries of EditText/List/Dialog/Ringtone preferences to
// their values. When their values change, their summaries are updated
// to reflect the new value, per the Android Design guidelines.
// bindPreferenceSummaryToValue(findPreference(getString(R.string.key_checkbox)));
}
/**
* {@inheritDoc}
*/
@Override
public boolean onIsMultiPane() {
return isXLargeTablet(this) && !isSimplePreferences(this);
}
/**
* Helper method to determine if the device has an extra-large screen. For
* example, 10" tablets are extra-large.
*/
private static boolean isXLargeTablet(Context context) {
return (context.getResources().getConfiguration().screenLayout
& Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE;
}
/**
* Determines whether the simplified settings UI should be shown. This is
* true if this is forced via {@link #ALWAYS_SIMPLE_PREFS}, or the device
* doesn't have newer APIs like {@link PreferenceFragment}, or the device
* doesn't have an extra-large screen. In these cases, a single-pane
* "simplified" settings UI should be shown.
*/
private static boolean isSimplePreferences(Context context) {
return ALWAYS_SIMPLE_PREFS
|| (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB)
|| !isXLargeTablet(context);
}
/**
* {@inheritDoc}
*/
@Override
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void onBuildHeaders(List<Header> target) {
if (!isSimplePreferences(this)) {
loadHeadersFromResource(R.xml.pref_headers, target);
}
}
@Override
protected boolean isValidFragment(String fragmentName) {
return NotificationPreferenceFragment.class.getName().equals(fragmentName)
|| GeneralPreferenceFragment.class.getName().equals(fragmentName)
|| AudioPreferenceFragment.class.getName().equals(fragmentName);
}
@Override
public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, final String key) {
if(key.equals(Tags.PREF_NOTIFICATION)
|| key.equals(Tags.PREF_NOTIFICATIONTIME)
|| key.equals(Tags.PREF_AUDIO_AUTODOWNLOAD)) {
if(sharedPreferences.getBoolean(Tags.PREF_NOTIFICATION, true)
|| sharedPreferences.getBoolean(Tags.PREF_AUDIO_AUTODOWNLOAD, true)) {
long time = sharedPreferences.getLong(Tags.PREF_NOTIFICATIONTIME, 60 * 7);
Notifications.setNotifications(this, time * 60 * 1000);
} else
Notifications.removeNotifications(this);
}
if(key.equals(Tags.PREF_NOTIFICATION) || key.equals(Tags.PREF_ADS)
|| key.equals(Tags.PREF_GOOGLEANALYTICS) || key.equals(Tags.PREF_SHOWNOTES)) {
//This toast is shown when I scroll down
Toast.makeText( getApplicationContext(), "Notification || Analytics", Toast.LENGTH_SHORT).show();
analytics("Settings", "Settings: " + key + ", " + sharedPreferences.getBoolean(key, true));
}
//Language change
if(key.equals(Tags.PREF_LANGUAGE)) {
try {
setLocale(sharedPreferences.getString(key, "en"));
} catch (Exception e) {
Log.e("Losungen", "Error changing language: " + e.getMessage());
e.printStackTrace();
}
}
//SD-Card change
if(key.equals(Tags.PREF_AUDIO_EXTERNAL_STORGAE)) {
boolean sd_card = sharedPreferences.getBoolean(key, false);
if(sd_card)
MainActivity.toast(this, this.getString(R.string.still_in_internal), Toast.LENGTH_LONG);
else
MainActivity.toast(this, this.getString(R.string.still_in_external), Toast.LENGTH_LONG);
}
}
/**
* This fragment shows general preferences only. It is used when the
* activity is showing a two-pane settings UI.
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static class GeneralPreferenceFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_general);
}
}
/**
* This fragment shows notification preferences only. It is used when the
* activity is showing a two-pane settings UI.
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static class NotificationPreferenceFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_notification);
}
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static class AudioPreferenceFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_audio);
}
}
}
还有我的 xml 文件:pref_general.xml
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<SwitchPreference
android:key="show_notes"
android:title="@string/pref_notes_title"
android:defaultValue="true" />
<SwitchPreference
android:key="show_ads"
android:title="@string/pref_ads_title"
android:summary="@string/pref_ads_summary"
android:defaultValue="false"
/>
<SwitchPreference
android:key="google_analytics"
android:title="@string/pref_google_title"
android:summary="@string/pref_google_summary"
android:defaultValue="true" />
<ListPreference
android:key="language"
android:title="@string/pref_language"
android:summary="@string/pref_language_summary"
android:entries="@array/pref_language_list_titles"
android:entryValues="@array/pref_language_list_values"
android:negativeButtonText="@null"
android:positiveButtonText="@null" />
</PreferenceScreen>
pref_notification.xml
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<!-- A 'parent' preference, which enables/disables child preferences (below)
when checked/unchecked. -->
<SwitchPreference
android:key="notifications_losung"
android:title="@string/pref_notifications"
android:defaultValue="true" />
<ListPreference
android:key="notifications_art"
android:dependency="notifications_losung"
android:title="@string/pref_notification_art"
android:defaultValue="0"
android:entries="@array/pref_notifications_list_titles"
android:entryValues="@array/pref_notifications_list_values"
android:negativeButtonText="@null"
android:positiveButtonText="@null" />
<de.schalter.losungen.preferences.TimePreference
android:key="notification_time"
android:defaultValue="420"
android:title="@string/pref_time"
android:dependency="notifications_losung"
/>
</PreferenceScreen>
pref_audio.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<!-- oder stream -->
<SwitchPreference
android:key="audio_download"
android:title="@string/pref_audio_download_title"
android:summaryOn="@string/pref_audio_download_summary_on"
android:summaryOff="@string/pref_audio_download_summary_off"
android:defaultValue="true" />
<!-- oder erst bei Nutzer interaktion -->
<SwitchPreference
android:key="audio_autodownload"
android:dependency="audio_download"
android:title="@string/pref_audio_autodownload_title"
android:summaryOn="@string/pref_audio_autodownload_summary_on"
android:summaryOff="@string/pref_audio_autodownload_summary_off"
android:defaultValue="true" />
<ListPreference
android:key="audio_autodownload_network"
android:dependency="audio_autodownload"
android:title="@string/pref_audio_autodownload_network_title"
android:defaultValue="0"
android:entries="@array/pref_audio_autodownload_network_entries"
android:entryValues="@array/pref_audio_autodownload_network_values"
android:negativeButtonText="@null"
android:positiveButtonText="@null" />
<SwitchPreference
android:key="audio_external_storage"
android:dependency="audio_download"
android:title="@string/pref_audio_externalstorage_title"
android:summaryOff="@string/pref_audio_externalstorage_summary_off"
android:summaryOn="@string/pref_audio_externalstorage_summary_on"
android:defaultValue="false" />
</PreferenceScreen>
我不知道为什么会这样。有些评论是德语的,但我想你什么都能听懂。有什么想法吗?
这是一个类似的问题,但没有有用的答案:Android Preferences - On/Off Switch Icons Reset When Scrolled Offscreen
最佳答案
引用Preference items being automatically re-set?上的回答,它建议您仅使用调用 super 的构造函数对 SwitchPreference 进行子类化,然后使用它代替标准 SwitchPreference。我注意到这发生在早期版本的 Android 上(在我们的例子中特别是 4.x),但不是 5+。
我怀疑这是因为 Preference 的构造函数中的这些行:
来自 API 17(需要此修改):
if (!getClass().getName().startsWith("android.preference")) {
// For subclasses not in this package, assume the worst and don't cache views
mHasSpecifiedLayout = true;
}
或来自 API 23(无需修改即可正常工作):
if (!getClass().getName().startsWith("android.preference")
&& !getClass().getName().startsWith("com.android")) {
// For non-framework subclasses, assume the worst and don't cache views.
mCanRecycleLayout = false;
}
通过 PreferenceGroupAdapter 进行跟踪,看起来当它回收 View 时它会设置一些东西,然后通知监听器首选项已更改。我找不到它实际上在哪里/为什么更改了首选项,所以我也不确定为什么更新的 API 中的更改修复了它,但这似乎就是正在发生的事情。
关于Android 偏好 - 在 SettingsActivity 中滚动到屏幕外时 SwtichPrefrence 发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35140581/
如果附加了 'not-scroll' 类,我希望我的 body 不滚动,否则它应该正常工作。 我已经搜索这个问题两天了,但找不到任何适合我的解决方案。 我想要的是向 body 添加一个 class,并
我发现似乎是 iOS Safari 中的错误(我正在 iOS 8 上进行测试)。当绝对定位的 iFrame 漂浮在一段可滚动内容上方时,滚动 iFrame 也会滚动下面的内容。以下 HTML (ava
我有以下代码来显示一系列投资组合图片,这些图片以 SVG 格式存储在滚动 div 中: 在 Safari 中滚动使用两根手指或鼠标滚轮当光标位于 SVG 之一上时不起作用。 该页
我想用 javascript 做的是: 一旦你向下滚动页面,将#sidebar-box-fixed 的位置从 position: relative; 更改为定位:固定;。改回position:rela
我对 Elasticsearch 的滚动功能有点困惑。在 elasticsearch 中,每当用户在结果集上滚动时,是否可以每次调用搜索 API?来自文档 "search_type" => "scan
我试图做到这一点,以便当我向上或向下滚动页面时,它会运行不同的相应功能。我发现了一个类似的问题here但我已经尝试了他们的答案并且没有运气。 注意:此页面没有正常显示的滚动条。没有地方可以滚动。 bo
(C语言,GTK库) 在我的表单上,我有一个 GtkDrawingArea 小部件,我在上面使用 Cairo 绘制 GdkPixbufs(从文件加载)。我想要完成的是能够在窗口大小保持固定的情况下使用
最近我一直在尝试创建一个拉到(刷新,加载更多)swiftUI ScrollView !!,灵感来自 https://cocoapods.org/pods/SwiftPullToRefresh 我正在努
我正在开发一个应用程序,其中有两个带有可放置区域的列表和一个带有可拖动项目的侧面菜单。 当我滚动屏幕时,项目的位置困惑。 我试图在谷歌上寻找一些东西,最后得到了这个问题:jQuery draggabl
我在 UIWebView 中加载了一个 HTML 表单,而我的 UIWebView 恰好从 View 的中间开始并扩展。我必须锁定此 webView 不滚动并将其放在 ScrollView 之上以允许
如何在每个元素而不是整个元素上应用淡入淡出(与其高度相比)? HTML: CSS: * { padding: 0; margin: 0; box-sizing: border
我想使用带有垂直轴的 PageView 并使用鼠标滚动在页面之间移动,但是当我使用鼠标滚动时页面不滚动...仅页面单击并向上/向下滑动时滚动。 有什么办法吗? 我想保留属性 pageSnapping:
我制作这个程序是为了好玩,但我被卡住了,因为程序在屏幕外运行。如何在不完全更改代码的情况下实现滚动条。 public static void main(String args[]) throws IO
我想使用带有垂直轴的 PageView 并使用鼠标滚动在页面之间移动,但是当我使用鼠标滚动时页面不滚动...仅页面单击并向上/向下滑动时滚动。 有什么办法吗? 我想保留属性 pageSnapping:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
使用 jquery 技术从 css-tricks.com 获得滚动/跟随侧边栏,如果您不知道我在说什么,这里是代码: $(function() { var $sidebar = $
我是 jQuery Mobile 新手。我需要向我的应用程序添加 Facebook 滑动面板功能。 我经历了 sliding menu panel ,它工作正常,但我在菜单面板中的内容超出了窗口大小,
有没有办法在 js 或 jQuery 或任何其他工具中检测 ctrl + 滚动。我正在尝试执行一些动态布局代码,我需要检测不同分辨率下的屏幕宽度,我通过使用 setTimeout() 的计时器实现了这
我有一部分html代码:
我想控制 RichTextBox 滚动,但在控件中找不到任何方法来执行此操作。 这样做的原因是我希望当鼠标光标位于 RichTextBox 控件上时鼠标滚轮滚动有效(它没有事件焦点:鼠标滚轮事件由表单
我是一名优秀的程序员,十分优秀!