系统深入学习android-Android框架学习-5.设置(Settings)
应用程序通常包括允许用户修改应用程序的特性和行为的设置功能。例如,一些应用程序允许用户指定通知是否启用或指定多久使用云同步数据。如果你想要为你的应用程序提供设置,你应该使用Android的Preference APIs来构建统一的接口。本章的主角就是Preference,下面先让我们看一下图5-1:
:
图5-1 这是android短信息应用程序的设置界面截图。它使用就是就是Preference
5.1 概述
相比使用View对象来构建用户接main,设置是构建Preference的子类。一个Preference对象是构建一个单一设置的一个部分。每一个Preference作为一个item在list并为用户修改设置提供了适当的界面。例如,一个CheckBoxPreference创建一个用于显示checkbox的list item,ListPreference创建一个选择列表来显示一个对话框的item。每一个Preference其实都以键值对的形式保存在你应用程序的SharedPreferences文件中。当用户改变设置时,系统会更新SharedPreferences文件中的键值对。我们只需要读取文件中的设置数据即可。SharedPreferences支持以下数据类型的保存:
Boolean
Float
Int
Long
String
String Set
因为你的应用程序设置界面是使用Preference对象构建的而不是view,你需要使用Activity或Fragment的子类来显示设置列表:
◆ 如果你的应用程序支持android 3.0以下版本,你必须使用PreferenceActivity类来构建。
◆ 如果高于或等于android 3.0版本,你可以使用PreferenceFragment。当然你屏幕如果足够大的话你还是可以使用PreferenceActivity创建双面板布局来显示多组设置
5.1.1 Preference
你应用中的每一个设置都代表一个Preference对象。每一个Preference的子类包含一组核心的属性,如允许你指定设置的标题和默认值这样的属性。每一个子类也提供自己的属性和用户界面。就想上面图5-1那样,每一个设置都是List View中的一个item,也是一个Preference对象。常见的Preference如下:
CheckBoxPreference
用checkbox显示一个item的设置是否为打开或关闭。他保存的是boolean值,true表示选中
ListPreference
以单选按钮列表的形式打开一个对话框,保存的值能支持任意类型
EditTextPreference
使用EditText打开一个对话框。保存的值为一个String。
5.2 在XML中定义Preferences
虽然你可以在运行时实例化新的Preference对象,但你也可以在XML中用Preference层级对象来定义。使用XML定义设置是首选,因为XML文件结构更容易阅读的并且更新也很简单。此外,你的应用程序的设置通常是预先确定的,但你仍然可以在运行时修改它们。每一个Preference子类都能使用XML节点来匹配声明。如<CheckBoxPreference>。你必须在项目的res/xml目录下保存这种XML文件。尽管你可以任意命名你的文件名字,但建议使用preferences.xml,方便以后识别自己写的东西。注意如果你想要为你的设置创建多面板布局,那你需要为每一个fragment创建单独的XML文件。
根节点的XML文件必须是一个< PreferenceScreen >元素。在这个元素中你可以添加每个Preference。每个你添加在< PreferenceScreen >元素下的子节点显示为单一列表项的设置。如代码清单5-1所示:
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"><CheckBoxPreferenceandroid:key="pref_sync"android:title="@string/pref_sync"android:summary="@string/pref_sync_summ"android:defaultValue="true" /><ListPreferenceandroid:dependency="pref_sync"android:key="pref_syncConnectionType"android:title="@string/pref_syncConnectionType"android:dialogTitle="@string/pref_syncConnectionType"android:entries="@array/pref_syncConnectionTypes_entries"android:entryValues="@array/pref_syncConnectionTypes_values"android:defaultValue="@string/pref_syncConnectionTypes_default" /> </PreferenceScreen>
代码清单5-1
在上面的例子中有一个CheckBoxPreference和一个ListPreference。这两个items包含以下三个属性:
◆android:key
这个属性是必须的,对于一个preferences 来说是一个持久的数据值。当在SharedPreferences中保存这个Setting值时这个指定唯一的key(一个字符串)是被系统使用的。但某些特殊情况,如preferences是一个PreferenceCategory或 PreferenceScreen,或者是一个XML中<Intent>调用时,又或者是一个Fragment显示时(用android:fragment属性),以上这些特殊情况下,这个key就不是必须的了。
◆android:title
为设置提供了一个用户可见的名称。
◆android:defaultValue
这指定初始值,系统应该建立在SharedPreferences文件。你应该为所有设置提供一个默认值。
关于其他更多属性,请直接查看Preference文档。
图 5-2 根据title的设置分类
1. 通过指定<PreferenceCategory>节点的分类
2. 通过使用android:title指定title分类.
当你的列表设置超过大约10项,您可能想通过添加标题定义分组设置或在一个单独的屏幕显示这些组。
5.2.1创建设置组(groups)
如果你列出10个或更多的设置,用户可能会有些头疼。这样我们就可以使用分组。以下有两种分组方法:
◆使用titles
◆使用subscreens
1. 使用titles
如果你想要根据标题来提供分界线,请使用PreferenceCategory如代码清单5-2所示:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"><PreferenceCategory android:title="@string/pref_sms_storage_title"android:key="pref_key_storage_settings"><CheckBoxPreferenceandroid:key="pref_key_auto_delete"android:summary="@string/pref_summary_auto_delete"android:title="@string/pref_title_auto_delete"android:defaultValue="false"... /><Preference android:key="pref_key_sms_delete_limit"android:dependency="pref_key_auto_delete"android:summary="@string/pref_summary_delete_limit"android:title="@string/pref_title_sms_delete"... /><Preference android:key="pref_key_mms_delete_limit"android:dependency="pref_key_auto_delete"android:summary="@string/pref_summary_delete_limit"android:title="@string/pref_title_mms_delete" ... /></PreferenceCategory>... </PreferenceScreen>
代码清单5-2
2. 使用subscreens
如果你想要放置设置组到一个subscreen中,请使用PreferenceScreen如图5-3和代码清单5-3:
图 5-3
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"><!--打开一个subscreen --><PreferenceScreenandroid:key="button_voicemail_category_key"android:title="@string/voicemail"android:persistent="false"><ListPreferenceandroid:key="button_voicemail_provider_key"android:title="@string/voicemail_provider" ... /><!--打开另一个嵌套的subscreen --><PreferenceScreenandroid:key="button_voicemail_setting_key"android:title="@string/voicemail_settings"android:persistent="false">...</PreferenceScreen><RingtonePreferenceandroid:key="button_voicemail_ringtone_key"android:title="@string/voicemail_ringtone_title"android:ringtoneType="notification" ... />...</PreferenceScreen>... </PreferenceScreen>
代码清单5-3
5.2.2使用Intents
某些情况下, 你可能想要一个preference item来打开不同的activity而不是设置屏幕,就像一个web浏览器来查看一个web页面。当用户选择一个preference item时可以调用Intent来启动。方法就是添加一个<intent>节点到<Preference>节点中。如代码清单5-4所示:
<Preference android:title="@string/prefs_web_page" ><intent android:action="android.intent.action.VIEW"android:data="http://www.example.com" /> </Preference>
代码清单5-4
你能使用以下属性创建隐式和显式的intents:
◆android:action
如同setAction()方法一样设置action
◆android:data
如同setData()方法一样设置data
◆android:mimeType
如同setType()方法一样设置MIME类型
◆android:targetClass
如同setComponent()方法一样设置组件类名
◆android:targetPackage
如同setComponent()方法一样设置组件包名
5.3 创建一个Preference Activity
为了在Acitivity中显示你的设置,你可以继承PreferenceActivity类。这是扩展于传统Activity的一个类,它基于Preference对象层级来显示一个设置列表。当用户做出一个改变时PreferenceActivity能自动保存与每一个Preference相关的设置。注意:如果在3.0或以上系统版本中,你应该使用PreferenceFragment。最重要的是要记住,你在onCreate()回调期间没有加载一个视图的布局。而是调用addPreferencesFromResource()来添加你定义的XML文件。例如代码清单5-5所示:
public class SettingsActivity extends PreferenceActivity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);addPreferencesFromResource(R.xml.preferences);} }
代码清单5-5
只要用户修改preference,系统将改变保存到一个默认的SharedPreferences文件。
5.4 使用Preference Fragments
如果你在android3.0或更高版本上开发,你应该使用PreferenceFragment来显示Preference 对象列表。你不应该在使用PreferenceActivity了。因为Fragments提供更为灵活的应用程序结构如代码清单5-6所示:
public static class SettingsFragment extends PreferenceFragment {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);addPreferencesFromResource(R.xml.preferences);}... }
代码清单5-6
然后你能吧这个fragment添加到Activity,如代码清单5-7所示:
public class SettingsActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();} }
代码清单5-7
注意:一个PreferenceFragment没有它自己的Context对象。如果你需要一个Content对象,你能调用getActivity()方法。然而,当fragment没有附加到activity中或者activity声明周期结束时分离后,你使用getActivity()返回的将是null。
5.5 Setting的默认值
你创建preferences可能是为你的应用程序定义一些重要的行为,所以当用户第一次打开你的应用程序时,为每一个Preference相关的SharedPreferences 文件初始化默认值是必要的。首先你必须为每一个Preference对象指定一个默认值,你可以在XML文件中使用android:defaultValue属性。例如代码清单5-8所示:
<CheckBoxPreferenceandroid:defaultValue="true"... /><ListPreferenceandroid:defaultValue="@string/pref_syncConnectionTypes_default"... />
代码清单5-8
然后,在Main Activity里的onCreate()方法中调用一次setDefaultValues(),如代码清单5-9所示:
PreferenceManager.setDefaultValues(this, R.xml.advanced_preferences, false);
代码清单5-9
在onCreate()方法的最开始就可以执行此方法,因为可能你的界面需要依据默认值来设置一个属性。这个方法中有三个参数:
1.应用程序的Context
2.Preference XML资源ID
3.这个boolean表示是否多次设置默认值,当然大部分情况下默认值一般我们只需要设置一次,就传false即可
5.6 使用Preference Headers
在少数情况下,如用首次屏幕显示的时候,你可能想要让用户先设置一些配置属性。在android3.0或更高版本系统下,你可以使用新的“headers”功能来代替以前的subscreens的嵌套。使用headers步骤如下:
1. 单独的每组设置作为独立PreferenceFragment的实例。即,每组设置需要一个单独的XML文件。
2. 创建一个XML头文件,其中列出了每个设置组和声明这fragment包含相应的设置列表。
3. 扩展PreferenceActivity类来托管您的设置。
4. 实现onBuildHeaders()回调用来指定头文件。
一个很棒的好处是,PreferenceActivity使用这个设计自动给出了双栏布局如图5-4大屏幕上运行时。
即使你的应用程序支持Android 3.0以上的版本,你也可以使用PreferenceFragment来构建应用程序用于较新的设备
图 5-4 使用headers的双面板布局
1. headers使用一个xml heanders文件定义
2.每一组设置通过PreferenceFragment来定义,并且在<header>节点中指定
图 5-5 这是一个手机设备,当一个item选中时候,会调用PreferenceFragment
5.6.1创建headers文件
每一组设置你都可以在<preference-headers>跟节点中指定一个<header>节点,如代码清单5-10所示:
<?xml version="1.0" encoding="utf-8"?> <preference-headers xmlns:android="http://schemas.android.com/apk/res/android"><header android:fragment="com.example.prefs.SettingsActivity$SettingsFragmentOne"android:title="@string/prefs_category_one"android:summary="@string/prefs_summ_category_one" /><header android:fragment="com.example.prefs.SettingsActivity$SettingsFragmentTwo"android:title="@string/prefs_category_two"android:summary="@string/prefs_summ_category_two" ><!—这个键值对可以当成一个fragment的参数--><extra android:name="someKey" android:value="someHeaderValue" /></header> </preference-headers>
代码清单5-10
使用android:fragment属性,每一个header声明一个PreferenceFragment实例,当用户选择这个header时就会打开这个PreferenceFragment。<extras>节点允许你通过键值对的形式传参,一般是使用Bundle。Fragment通过调用getArguments()来得到参数。关于参数的用途比较常见的就是为每一个组重用相同的PreferenceFragment子类并且使用参数还是制定你将要载入哪一个preferences XML文件。例如,下面是一个fragment,它被多个设置组重用,下面代码清单5-11中在XML中使用了<extra>节点,key为“settings”:
public static class SettingsFragment extends PreferenceFragment {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);String settings = getArguments().getString("settings");if ("notifications".equals(settings)) {addPreferencesFromResource(R.xml.settings_wifi);} else if ("sync".equals(settings)) {addPreferencesFromResource(R.xml.settings_sync);}} }
代码清单5-11
5.6.2显示headers
为了显示preference headers, 你必须实现onBuildHeaders()回调方法并且调用loadHeadersFromResource()如代码清单5-12所示:
public class SettingsActivity extends PreferenceActivity {@Overridepublic void onBuildHeaders(List<Header> target) {loadHeadersFromResource(R.xml.preference_headers, target);} }
代码清单5-12
当用户从headers列表中选择一个item时,系统会打开相关的PreferenceFragment。注意当使用preference headers时候,你的PreferenceActivity 子类不需要onCreate()方法,因为这个activity的任务仅仅是载入headers而已。
5.6.3老版本中支持Preference header
如果你的应用程序既支持3.0以下的版本,也支持3.0以上的版本,要么3.0以上我们使用headers能提供双面板布局。低于3.0的版本我们就可以添加额外的preferences XML但里面不是使用<header>而是使用<Preference>节点了。但每一个<Preference>都发送一个intent到PreferenceActivity。例如让我们先看下3.0或以上版本的代码清单5-13中(res/xml/preference_headers.xml):
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android"><header android:fragment="com.example.prefs.SettingsFragmentOne"android:title="@string/prefs_category_one"android:summary="@string/prefs_summ_category_one" /><header android:fragment="com.example.prefs.SettingsFragmentTwo"android:title="@string/prefs_category_two"android:summary="@string/prefs_summ_category_two" /> </preference-headers>
代码清单5-13
然后让我们再看下3.0以下版本的代码清单5-14中(res/xml/preference_headers_legacy.xml):
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"><Preference android:title="@string/prefs_category_one"android:summary="@string/prefs_summ_category_one" ><intent android:targetPackage="com.example.prefs"android:targetClass="com.example.prefs.SettingsActivity"android:action="com.example.prefs.PREFS_ONE" /></Preference><Preference android:title="@string/prefs_category_two"android:summary="@string/prefs_summ_category_two" ><intent android:targetPackage="com.example.prefs"android:targetClass="com.example.prefs.SettingsActivity"android:action="com.example.prefs.PREFS_TWO" /></Preference> </PreferenceScreen>
代码清单5-14
因为android3.0中支持<preference-headers>,仅在android3.0或更高版本中系统会在PreferenceActivity中调用onBuildHeaders()方法。当然如果用户的系统不是3.0(HONEYCOMB)的你就必须调用preference_headers_legacy.xml,然后调用addPreferencesFromResource()来载入xml文件。例如代码清单5-15所示:
@Override public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);...if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {//低于3.0版本载入legacy preferences headers addPreferencesFromResource(R.xml.preference_headers_legacy);} }// 高于或等于3.0版本会调用此方法 @Override public void onBuildHeaders(List<Header> target) {loadHeadersFromResource(R.xml.preference_headers, target); }
代码清单5-15
剩下的3.0以下版本就是通过处理Intent来识别哪个preference文件要被加载到Activity中来。所以需要检索intent的action并与在preference XML<intent>下已知action字符串比较,如代码清单5-16所示:
final static String ACTION_PREFS_ONE = "com.example.prefs.PREFS_ONE"; ...@Override public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);String action = getIntent().getAction();if (action != null && action.equals(ACTION_PREFS_ONE)) {addPreferencesFromResource(R.xml.preferences);}...else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {// 载入3.0以下版本的legacy preferences文件 addPreferencesFromResource(R.xml.preference_headers_legacy);} }
代码清单5-16
注意连续调用addPreferencesFromResource()会堆叠所有的preferences到一个单独的列表中,所以确保他只调用一次,把它写到else-if的条件分支下。
5.7 读取Preferences
默认的,所有你应用中的preferences会保存到一个文件中,你可以调用静态方法PreferenceManager.getDefaultSharedPreferences()来获得你保存的preferences。它将返回一个SharedPreferences对象包含所有你在PreferenceActivity中使用的Preference对象的键值对。例如,下面代码清单5-17教你如何读取:
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); String syncConnPref = sharedPref.getString(SettingsActivity.KEY_PREF_SYNC_CONN, "");
代码清单5-17
5.7.1监听Preference的改变
有些情况下你可能想只要一个preferences改变你就想得到通知。当任意一个preferences发生改变时,为了取得一个回调,我们可以实现SharedPreference.OnSharedPreferenceChangeListener这个接口并通过SharedPreferences.registerOnSharedPreferenceChangeListener()来注册监听。这个接口只有一个回调方法,就是onSharedPreferenceChanged()你很容易就找到。如代码清单5-18所示:
public class SettingsActivity extends PreferenceActivityimplements OnSharedPreferenceChangeListener {public static final String KEY_PREF_SYNC_CONN = "pref_syncConnectionType";...public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {if (key.equals(KEY_PREF_SYNC_CONN)) {Preference connectionPref = findPreference(key);// 为选中的值设置用户描述摘要。connectionPref.setSummary(sharedPreferences.getString(key, ""));}} }
代码清单5-18
这个例子中,onSharedPreferenceChanged()方法会检测改变的设置是否为一个已知的preference key。如果是就会调用findPreference()来获得Preference对象,并且这是改变后的对象你可以做你想做的事情,这里我们设置了一个摘要用于当用户选中时给出提示信息。其实这是一个比较好的方法,特别是多个被选中时,你可以通过现有的API让用户知道他们做了些什么并得到反馈。还有请注意记得在Activity声明周期中的onPause()和 onResume()方法中注册于注销你的监听,如代码清单5-19所示:
@Override protected void onResume() {super.onResume();getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); }@Override protected void onPause() {super.onPause();getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); }
代码清单5-19
5.8 管理网络的使用
从Android4.0开始,系统的设置应用程序允许用户能看到他们的应用程序在前台和后台使用了多少网络数据。用户对于个别Apps能关闭使用后台数据。为了避免用户关闭你的程序从后台访问数据的功能,你应该使用数据连接有效并允许用户通过你应用程序的设置来完善你应用程序的数据使用。例如你可能允许用户控制你的APP多久同步一次数据,是否你的app仅在Wifi情况下才更新和下载,漫游情况下如何处理等。这样的好处是给用户更精准的控制你的程序使用多少数据,有这样的精准控制,用户就不会在系统设置中直接把你的应用访问数据的功能给关掉。一旦你在PreferenceActivity 中添加了必要的preferences来控制你App的数据,并养成了这种写程序的习惯,那接下来我很乐意给你说明一下,你应该在manifest文件中添加一个intentfilter名字为ACTION_MANAGE_NETWORK_USAGE,如代码清单5-20所示:
<activity android:name="SettingsActivity" ... ><intent-filter><action android:name="android.intent.action.MANAGE_NETWORK_USAGE" /><category android:name="android.intent.category.DEFAULT" /></intent-filter> </activity>
代码清单5-20
这个intent filter表明了这个activity告诉系统我能控制这个应用程序的数据使用。因此,当用户在设置应用中检查你app使用了多少数据时,一个App设置按钮便可用了,你点击它会启动PreferenceActivity然后让用户在精确控制你的app数据使用情况。
5.9 构建自定义的Preference
Android框架包含各种各样的Preference子类允许你构建自己的UI。然而你可能发现一个设置没有好的内置方案,如一个number picker或date picker。在这种情况下你需要创建自定义的preference,你需要继承Preference类。当然扩展Preference类后有一些重要的事情要做:
◆当用户选择设置的时候指定用户接口
◆在适当的情况下保存setting的值
◆当进入我们的View时,使用当前值或默认值初始化Preference
◆当被系统请求时,提供默认值
◆如果Preference提供它自己的UI(如一个对话框),保存和恢复状态并处理生命周期的改变 。
5.9.1指定用户界面
如果你直接扩展Preference类,当用户选择一个item时,你需要实现onClick()用来定义action。其实大部分情况下就是直接继承的DialogPreference显示对话框的形式,这样简化的程序。如果你继承了DialogPreference,你必须在类的构造函数中调用setDialogLayoutResourcs()来指定布局。如代码清单5-21所示:
public class NumberPickerPreference extends DialogPreference {public NumberPickerPreference(Context context, AttributeSet attrs) {super(context, attrs);setDialogLayoutResource(R.layout.numberpicker_dialog);setPositiveButtonText(android.R.string.ok);setNegativeButtonText(android.R.string.cancel);setDialogIcon(null);}... }
代码清单5-21
5.9.2保存设置的值
你可以在任意时刻调用Preference类的persist*()方法来保存一个值,如设置的值为int,那么就使用persistInt()。这个方法用在对话框关闭的时候调用比较好,它会给用户一个提示。当点击positive按钮时,你就可以保存新的值。如代码清单5-22所示:
@Override protected void onDialogClosed(boolean positiveResult) {// 当用户选择OK时,保存新的值if (positiveResult) {persistInt(mNewValue);} }
代码清单5-22
在上面这个例子中,mNewValue是一个类成员变量,并且是int型的。
5.9.3初始化当前值
当系统添加你的Preference 到屏幕时,它会调用onSetInitialValue() 来通知你的值是否是已经存在的值。如果不存在,这个调用会提供一个默认值。onSetInitialValue()方法通过一个boolean值来表明一个值是否已经被存储了。如果为true,你应该把存储的值给取出来,你可以使用getPersistedInt()这样类似的方法取值。如果restorePersistedValue这个参数的值为false,那么你就可以使用第二个默认值参数了,如代码清单5-23所示:
@Override protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {if (restorePersistedValue) {// 恢复状态mCurrentValue = this.getPersistedInt(DEFAULT_VALUE);} else {// 从xml属性中设置默认状态mCurrentValue = (Integer) defaultValue;persistInt(mCurrentValue);} }
代码清单5-23
请注意这里当restorePersistedValue为true时不能使用参数自带的defaultValue,因为它的值为null,只有当restorePersistedValue为false时才能使用。
5.9.4提供一个默认值
如果Preference的实例指定一个默认值(使用android:defaultValue属性),那么当Preference实例化对象时为了取得默认值,系统会调用onGetDefaultValue()方法。你必须实现这个方法,这样在系统保存默认值到SharedPreferences的时候才能正确处理。例如代码清单5-24所示:
@Override protected Object onGetDefaultValue(TypedArray a, int index) {return a.getInteger(index, DEFAULT_VALUE); }
代码清单5-24
方法参数提供你需要的一切:数组属性和你需要检索的android:defaultValue的索引位置,原因你必须实现这个方法来提取默认值的属性,因为您必须指定一个本地属性的默认值,以防值是未定义的。
5.9.5保存和恢复Preference的状态
就像一个在布局中的View,你的Preference子类负责保存和恢复它的状态,以防止activity和fragment被重新启动。妥善保存和恢复你Preference类的状态,你必须实现生命周期中的onSaveInstanceState()和onRestoreInstanceState()回调。Preference的状态可以通过Parcelable接口实现。Android框架提供这样一个对象,你可以作为入口点定义你对象的状态,比如Preference.BaseSavedState类。定义你Preference保存状态,你应该继承Preference.BaseSavedState类。你需要重写一些方法来定义CREATOR对象。对于大部分应用程序,你可以直接复制一下实现并做一些简单的改变即可,如代码清单5-25所示:
private static class SavedState extends BaseSavedState {int value;public SavedState(Parcelable superState) {super(superState);}public SavedState(Parcel source) {super(source);// 获得当前preference的值value = source.readInt(); }@Overridepublic void writeToParcel(Parcel dest, int flags) {super.writeToParcel(dest, flags);// 写入preference的值 dest.writeInt(value); }public static final Parcelable.Creator<SavedState> CREATOR =new Parcelable.Creator<SavedState>() {public SavedState createFromParcel(Parcel in) {return new SavedState(in);}public SavedState[] newArray(int size) {return new SavedState[size];}}; }
代码清单5-25
下面是具体运用在onSaveInstanceState()和andonRestoreInstanceState()中的过程,如代码清单5-26所示:
@Override protected Parcelable onSaveInstanceState() {final Parcelable superState = super.onSaveInstanceState();// 检查Preference是否被保存过if (isPersistent()) {//不需要保存实例状态,因为它是持久化的,使用父类状态return superState;}// 创建自定义的BaseSavedState实例final SavedState myState = new SavedState(superState);// 使用类成员变量赋值myState.value = mNewValue;return myState; }@Override protected void onRestoreInstanceState(Parcelable state) {//检查我们在onSaveInstanceState中是否保存过状态if (state == null || !state.getClass().equals(SavedState.class)) {// 没有保存状态,调用父类的方法super.onRestoreInstanceState(state);return;}// 强制转换到自定义的BaseSavedStateSavedState myState = (SavedState) state;super.onRestoreInstanceState(myState.getSuperState());// 应用它的值到UI,以恢复UI状态 mNumberPicker.setValue(myState.value); }
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 如何将域名指向本地
在测试过程中遇到一个问题:需要构造一种场景,就是对某个域名发送上行消息链接不上的情况,想了想,有个办法可以尝试,就是将该域名指向本地。 我的是mac系统,简单粗暴 cd /etc sudo vim hosts 127.0.0.1 …...
2024/4/19 14:19:06 - 关于c语言通过函数修改作为参数的指针变量的一点小心得
1、c语言没有引用传参,可通过将指针变量地址传入函数(即foo(&x))的方法来通过函数改变函数外指针变量的值。 2、也可以使用二级指针,使用二级指针时要注意为二级指针所指位置分配内存(即欲修…...
2024/4/18 12:51:51 - 达梦sql优化实践5
Fgwzd项目sql语句优化 原sql如下: –页脚统计 select /* ADAPTIVE_NPLN_FLAG(3) */ count(0) , nvl(sum(TOTAL_INVEST), 0), nvl(sum(NUM), 0) , nvl(sum(INVEST_REQUIREMENTS), 0) FROM ( SELECT LBFN.ID , LBFN.FILE_NO , LBFN.FILE_NAME , COUNT(LBPM.ID) AS NUM…...
2024/4/15 12:26:15 - MarkDown基础知识
1101MarkDown学习 1.大纲视图无法折叠? 解决:文件(F)-- 偏好设置(Ctrl逗号): ## 2.字体 粗体:两边加俩星号 **(不要加空格) HelloWorld! 斜体:两边加一个星号 * HelloWorld! 斜体加粗:两…...
2024/4/15 12:26:45 - Linux下抓包命令Tcpdump
一、命令概述 tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。 二、命令参数 -A 以ASCII格式打印出所有分组,并将链路层的头最…...
2024/4/15 12:26:20 - Array.prototype.find 数组find方法
let users [{id:1,name:李四},{id:2,name:张三},{id:3,name:王五} ] Array.prototype.find function(callback){for(var i 0;i<this.length;i){if(callback(this[i])){break};}console.log(i)return this[i] } function getitem (item){return item.id3 } let a users.f…...
2024/4/22 8:49:32 - instanceof 和 typeof 的实现原理
一. typeof 实现原理 typeof 一般被用于判断一个变量的类型,(适用于变量是js的基本数据类型时)我们可以利用 typeof 来判断number, string, object, boolean, function, undefined, symbol 这七种类型,这种判断能帮助我们搞定一些…...
2024/4/23 19:07:37 - openapi 3.0 规范说明
前言 任何项目在开发完成后都需要编写接口文档,而手动编写文档即消耗人力又可能由于维护不及时导致文档和项目版本不一致,反之如果使用swagger在项目更新的同时自动生成相应的接口文档则可以避免上述问题。由于swagger2.0的规范依赖于openapi 3.0版本的规范,所以在使…...
2024/4/20 11:53:33 - 在Android的App中动态的加载Java类
原文的地址:http://yenliangl.blogspot.com/2009/11/dynamic-loading-of-classes-in-your.html 我正在编写一个应用程序能够加载别人开发的应用插件。对于应用程序思路的实现,我首先想到的是使用 Class.forName 以及java.lang.reflective中的提供的方法。我比较倾向于使用 Cla…...
2024/4/15 12:26:40 - Prometheus+Grafana:生成pdf报表
条件 1、需要联网 2、未使用容器(后期可能会直接做一个容器镜像,打开即用) 效果 监控视图 自动导出的PDF...
2024/4/17 13:23:26 - 【SpringCloud------Eureka】
SpringCloud------Eureka1.初识Eureka1.1案例分析来认识Eureka1.2 Eureka简介2.Eureka注册中心原理2.1 原理图(基本架构)2.2 原理3.Eureka集群原理4.Eurka 工作流程5. Eureka 常用配置5.1 Eureka Server常用配置5.2 Eureka Client 常用配置5.3 Eureka In…...
2024/4/20 16:13:34 - Linux搭建redis主从复制
Linux搭建redis主从复制一主二从搭建查询主从信息设置主从关系一主二从搭建 一台服务器模拟三台主机: 第一步:将redis.conf 拷贝三份,名字分别是,redis6379.conf,redis6380.conf,redis6381.conf 第二步&am…...
2024/4/15 12:26:35 - 游戏陪玩app源码是如何实现倒计时功能的?
倒计时功能是很多互联网产品必备的功能之一,像游戏陪玩app源码中订单的失效时间等都会用到倒计时功能,那么为了带给用户更好的使用体验,在游戏陪玩app源码开发中是如何实现倒计时功能的呢? 代码实现过程 首先我们先来屡一下逻辑…...
2024/4/21 11:05:28 - tensorflow1.0 学习日志 session、constant、get_variable、placeholder
tf.Session() session.run()中feed_dict可定义任何张量 session.run(c p,feed_dict{p:33})变量 tf.get_variable(name,shape,varible, dtype)常量 tf.constant(varible, dtype,shape)占位符 tf.placehoder(dtype,shape,name)dtype tf.int tf.float3…...
2024/4/15 12:26:35 - 前端 实现数据的分批加载
UNI-APP上拉分段加载数据 当服务端数据没有进行分页处理时,ajax请求一次接口返回所有的数据;当请求数据过多的时候页面渲染会非常慢,并且很容易造成页面卡死现象;因此,前端可以通过js进行分页,达到分批加载…...
2024/4/20 15:21:31 - STM32F429HAL库串口MDA配置
.c文件 #include "usart.h" //#include "delay.h"/* 1、STM32F429有2个DMA控制器(DMA1和DMA2),每个控制器有8个数据流,每个数据流有8个通道(请求)。 2、支持外设到存储器、存储器到外设、存储器到存储器传输的常规通道。(仅DMA2支持存储器到存…...
2024/4/15 12:26:30 - VSCode官网下载缓慢或下载失败的解决办法
巨好用https://blog.csdn.net/zhaomengszu/article/details/112261258...
2024/4/19 12:02:58 - 学python的一天天day4
最近在忙着实习工作的事情,一切稳定下来了,又可以接着学习python了 函数的参数 python函数的定义非常灵活,除了正常定义的参数之外,还可以使用默认的参数,可变参数和关键词参数 位置参数 def power(x):return x*x …...
2024/4/15 12:26:35 - 怎么查看ip地址?
目前,在大数据时代下代理ip的用处变得十分重要,ip地址在大家身边的应用也是很多的,有很多的朋友不清楚固定ip地址是什么,下面就给大家详细介绍下相关信息: 1、静态ip地址又称为固定ip地址,是指长期分配给计…...
2024/4/18 11:30:36 - Linux常用命令汇总
Linux命令汇总 这段时间总结的linux命令,后续还会更新 //zip 压缩 zip hkd.zip hkd111.txt ... zip -r kd.zip /home/hkd20211022/hkdtest1 //unzip 解压缩 unzip hkd.zip unzip -d /home/hkd20211022/hkdtest1 hkd.zip //tar 压缩 tar -zcvf kd1.tar.gz kd111.…...
2024/4/18 16:22:18
最新文章
- 搞嵌入式到底属于程序员吗?
搞嵌入式到底属不属于程序员呢?毫无疑问,当然算啊!而且我十分赞同另一位朋友所说的:嵌入式程序员是难得的全栈型程序员。尽管嵌入式领域方向众多且繁杂,但他们同样也是会写代码的程序员。 嵌入式行业主要分为硬件和软…...
2024/4/25 18:54:02 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - Python中大的一把锁
今天可以来讲解下GIL是个什么了。 GIL为什么是Python中大的一把锁? GIL是Global Interpreter Lock的缩写,翻译过来就是全局解释器锁。 从字面上去理解,它就是锁在解释器头上的一把锁,它使Python代码运行变得有序。 假如有一段…...
2024/4/23 13:35:28 - 解析大语言模型训练三阶段
大语言模型的训练过程一般包括3个阶段:预训练(Pre-training)、SFT(有监督的微调,Supervised-Finetuning)以及RLHF(基于人类反馈的强化学习,Reinforcement Learning from Human Feedb…...
2024/4/23 6:25:26 - 【项目新功能开发篇】开发编码
作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过大学刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是࿰…...
2024/4/23 6:10:38 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/25 11:51:20 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/25 18:39:24 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/25 18:38:39 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/25 18:39:23 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/25 18:39:22 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/25 18:39:22 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/25 18:39:20 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/25 16:48:44 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/25 13:39:44 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/25 18:39:16 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/25 18:39:16 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/25 0:00:17 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/25 4:19:21 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/25 18:39:14 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/25 18:39:12 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/25 2:10:52 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/25 18:39:00 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/25 13:19:01 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/25 18:38:58 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/25 18:38:57 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57