本文将分享指针的详细内容,并且还将对PointerVS引用进行详尽解释,此外,我们还将为大家带来关于android–PreferenceManager.getDefaultSharedPreferen
本文将分享指针的详细内容,并且还将对Pointer VS 引用进行详尽解释,此外,我们还将为大家带来关于android – PreferenceManager.getDefaultSharedPreferences()vs getPreferences()、android – SharedPreferences ListPreference NullPointerException、android – 内部PreferenceScreen无法使用PreferenceFragmentCompat打开、android – 启动时PreferenceManager.getDefaultSharedPreferences的NullPointerException的相关知识,希望对你有所帮助。
本文目录一览:- 指针(Pointer) VS 引用(Reference)(指针 引用区别)
- android – PreferenceManager.getDefaultSharedPreferences()vs getPreferences()
- android – SharedPreferences ListPreference NullPointerException
- android – 内部PreferenceScreen无法使用PreferenceFragmentCompat打开
- android – 启动时PreferenceManager.getDefaultSharedPreferences的NullPointerException
指针(Pointer) VS 引用(Reference)(指针 引用区别)
@H_301_2@
指针与引用看上去完全不同(指针用操作符“*”和“->”,引用使用操作符“. ”),但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢? string& rs; // 错误,引用必须被初始化
传值(Value) VS 传引用(Reference) 传引用时只在栈上为实参分配一个指针的存储空间,函数调用时只把实参的指针传递进来了(引用实际上是不易出错的指针)。函数体中对形参的一切操作,就是对实参的操作。 总结(Summary) |
android – PreferenceManager.getDefaultSharedPreferences()vs getPreferences()
PreferenceManager.getDefaultSharedPreferences(context)
和
getPreferences()
似乎检索不同的首选项.
PreferenceManager.getDefaultSharedPreferences(context).getBoolean(
"userWasAskedToEnableGps", false);
对我来说,返回false,
getPreferences(MODE_PRIVATE).getBoolean("userWasAskedToEnableGps", false);
返回true.
Preference是用编辑器编写的
Editor e = getPreferences(MODE_PRIVATE).edit();
e.putBoolean (...);
e.commit();
如何在Context中的Activity之外获得相同的Preferences?
解决方法:
从android github repo(1),我们可以看到getPreferences除了使用当前类名调用getSharedPreferences方法之外什么都不做.
public SharedPreferences getPreferences( int mode ) {
return getSharedPreferences( getLocalClassName(), mode );
}
没有什么限制其他活动/代码使用适当的类名访问共享首选项.更重要的是,我不想使用getPreferences,因为这意味着=>永远不会更改活动名称.如果更改,则使用明确提及的早期类名称(升级前)来处理访问共享首选项.
android – SharedPreferences ListPreference NullPointerException
我的错误:
08-20 00:14:25.195: E/AndroidRuntime(1260): FATAL EXCEPTION: main 08-20 00:14:25.195: E/AndroidRuntime(1260): java.lang.NullPointerException 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.preference.ListPreference.findindexOfValue(ListPreference.java:215) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.preference.ListPreference.getValueIndex(ListPreference.java:224) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.preference.ListPreference.getEntry(ListPreference.java:202) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.preference.ListPreference.getSummary(ListPreference.java:148) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.preference.Preference.onBindView(Preference.java:515) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.preference.Preference.getView(Preference.java:453) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.preference.PreferenceGroupAdapter.getView(PreferenceGroupAdapter.java:222) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.widget.AbsListView.obtainView(AbsListView.java:2461) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.widget.ListView.makeAndAddView(ListView.java:1775) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.widget.ListView.fillDown(ListView.java:678) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.widget.ListView.fillFromTop(ListView.java:739) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.widget.ListView.layoutChildren(ListView.java:1628) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.widget.AbsListView.onLayout(AbsListView.java:2296) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.view.View.layout(View.java:14063) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.view.ViewGroup.layout(ViewGroup.java:4603) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1655) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1513) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.widget.LinearLayout.onLayout(LinearLayout.java:1426) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.view.View.layout(View.java:14063) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.view.ViewGroup.layout(ViewGroup.java:4603) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.view.View.layout(View.java:14063) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.view.ViewGroup.layout(ViewGroup.java:4603) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1655) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1513) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.widget.LinearLayout.onLayout(LinearLayout.java:1426) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.view.View.layout(View.java:14063) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.view.ViewGroup.layout(ViewGroup.java:4603) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.view.View.layout(View.java:14063) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.view.ViewGroup.layout(ViewGroup.java:4603) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.view.ViewRootImpl.performlayout(ViewRootImpl.java:1994) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1815) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1112) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4518) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.view.Choreographer.doCallbacks(Choreographer.java:555) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.view.Choreographer.doFrame(Choreographer.java:525) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.view.Choreographer$FramedisplayEventReceiver.run(Choreographer.java:711) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.os.Handler.handleCallback(Handler.java:615) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.os.Handler.dispatchMessage(Handler.java:92) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.os.Looper.loop(Looper.java:137) 08-20 00:14:25.195: E/AndroidRuntime(1260): at android.app.ActivityThread.main(ActivityThread.java:4898) 08-20 00:14:25.195: E/AndroidRuntime(1260): at java.lang.reflect.Method.invokeNative(Native Method) 08-20 00:14:25.195: E/AndroidRuntime(1260): at java.lang.reflect.Method.invoke(Method.java:511) 08-20 00:14:25.195: E/AndroidRuntime(1260): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) 08-20 00:14:25.195: E/AndroidRuntime(1260): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 08-20 00:14:25.195: E/AndroidRuntime(1260): at dalvik.system.NativeStart.main(Native Method)
xml布局:
<ListPreference android:key="frequency_key" android:title="Sample Rate" android:defaultValue="8000" android:entries="@array/freq_titles" android:entryValues="@array/freq_values" />
xml数组:
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="freq_titles"> <item name="8000">8k Hz</item> <item name="16000">16k Hz</item> <item name="22050">22.05k Hz</item> <item name="44100">44.1k Hz</item> <item name="48000">48k Hz</item> </string-array> <array name="freq_values"> <item name="8000">8000</item> <item name="16000">16000</item> <item name="22050">22050</item> <item name="44100">44100</item> <item name="48000">48000</item> </array> </resources>
更新:即使我从默认的共享首选项中执行getAll(),它也很奇怪,它向我显示“frequency_key = 8k Hz”.所以它已经初始化了.
来自我的偏好类的更多代码:
public class Settings_ActivityAH extends PreferenceFragment implements OnSharedPreferencechangelistener{ private SharedPreferences prefs; private Preference myAccountName; private Preference myGoogleUsername; private Preference myGooglePassword; private static Context context; public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); addPreferencesFromresource(R.xml.preferences); context = getActivity(); if (context == null){ Log.e("error","context is null"); } prefs = PreferenceManager.getDefaultSharedPreferences(context); myAccountName = (Preference) findPreference("account_name_title_key"); myGoogleUsername = (Preference) findPreference("googleusername_key"); myGooglePassword = (Preference) findPreference("googlepassword_key"); myAccountName.setSummary(prefs.getString("account_name_title_key","none")); myGoogleUsername.setTitle("username: "+prefs.getString("googleusername_key","none")); myGooglePassword.setTitle("password: "+prefs.getString("googlepassword_key","none")); Log.e("Check prefs",prefs.getAll().toString()); prefs.registerOnSharedPreferencechangelistener(this); } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,String key) { Log.e("in onSharedPref","yea"); Preference preference = findPreference(key); if (preference.getClass() == EditTextPreference.class){ Log.e("in editText Pref","yeah"); if( key.equals("account_name_title_key")){ myAccountName.setSummary(sharedPreferences.getString("account_name_key","none")); Log.e("accountname prefs",sharedPreferences.getString("account_name_key","none")); } if( key.equals("account_name_key")){ myAccountName.setSummary(sharedPreferences.getString("account_name_key","none")); } else if (preference.getClass() == PreferenceCategory.class){ Log.e("in category Pref","yeah"); if (key.equals("googleusername_key")){ myGoogleUsername.setTitle("Username: "+sharedPreferences.getString(key,"none")); Log.e("googleusername prefs",sharedPreferences.getString(key,"none")); } else if( key.equals("googlepassword_key")){ myGooglePassword.setTitle("Password: "+sharedPreferences.getString(key,"none")); Log.e("googlepassword prefs","none")); } } } else{ Log.e("insufficient key called","onSharedPreferenceChanged AH"); } }
}
解决方法
关于你的问题,getString()将返回与被点击的条目对应的android:entryValues数组的元素. android:entries数组仅用作用户的一系列显示字符串,并且在代码中没有其他影响,而android:entryValues中的值用于应用程序中的持久存储.
android – 内部PreferenceScreen无法使用PreferenceFragmentCompat打开
我的PreferenceFragmentCompat的内部PreferenceScreen没有显示,或者似乎忽略了点击事件.
我创建了扩展PreferenceFragmentCompat的MyPreferenceFragment
public class MyPreferenceFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
addPreferencesFromresource(R.xml.preferences);
}
}
然后我在styles.xml上更改了我的主题
<style name="AppTheme" parent="@style/Theme.AppCompat.Light">
<item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
</style>
最后创建我的preferences.xml文件
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<CheckBoxPreference android:title="Check Me"/>
<PreferenceScreen android:title="My Screen"> <!-- This is not opening -->
<EditTextPreference android:title="Edit text" />
</PreferenceScreen>
</PreferenceScreen>
在build.gradle中,我添加了两个:
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.android.support:preference-v7:23.0.1'
活动的代码
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
activity_main.xml中
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment"
android:name="com.mando.preferenceapp.MyPreferenceFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
测试上面的代码我无法打开/进入首选项屏幕.我错过了什么吗?为什么这不起作用?
解决方法:
花了很多时间尝试,搜索并感谢支持库的创建者的一些帮助.我成功地使它成功了.
第1步.活动
public class MyActivity extends AppCompatActivity implements
PreferenceFragmentCompat.OnPreferenceStartScreenCallback {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
// Create the fragment only when the activity is created for the first time.
// ie. not after orientation changes
Fragment fragment = getSupportFragmentManager().findFragmentByTag(MyPreferenceFragment.FRAGMENT_TAG);
if (fragment == null) {
fragment = new MyPreferenceFragment();
}
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragment_container, fragment, MyPreferenceFragment.FRAGMENT_TAG);
ft.commit();
}
}
@Override
public boolean onPreferenceStartScreen(PreferenceFragmentCompat preferenceFragmentCompat,
PreferenceScreen preferenceScreen) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
MyPreferenceFragment fragment = new MyPreferenceFragment();
Bundle args = new Bundle();
args.putString(PreferenceFragmentCompat.ARG_PREFERENCE_ROOT, preferenceScreen.getKey());
fragment.setArguments(args);
ft.replace(R.id.fragment_container, fragment, preferenceScreen.getKey());
ft.addToBackStack(preferenceScreen.getKey());
ft.commit();
return true;
}
}
提示.
>不要通过xml添加片段,您将在方向更改时崩溃.
>在onCreate中处理活动/片段添加的重新创建,以避免在首选项屏幕内丢失您的片段.
>片段的主机活动应实现PreferenceFragmentCompat.OnPreferenceStartScreenCallback并重新创建同一实例的片段.
第2步.PreferenceFragment
public class MyPreferenceFragment extends PreferenceFragmentCompat {
public static final String FRAGMENT_TAG = "my_preference_fragment";
public MyPreferenceFragment() {
}
@Override
public void onCreatePreferences(Bundle bundle, String rootKey) {
setPreferencesFromresource(R.xml.preferences, rootKey);
}
}
提示.
>使用方法setPreferencesFromresource并利用每个屏幕的rootKey.这样您的代码将被正确重用.
>请记住,如果你的片段中有像findPreference这样的代码,它应该有空检查,因为当你在内部屏幕时,这将不会给你什么.
现在缺少的是在动作栏中执行后退箭头(主动作),但这本身并不起作用;-)
我还创建了一个包含所有这些代码的演示应用程序,您可以在github找到它.
android – 启动时PreferenceManager.getDefaultSharedPreferences的NullPointerException
01-20 22:37:46.595: E/AndroidRuntime(7350): FATAL EXCEPTION: main 01-20 22:37:46.595: E/AndroidRuntime(7350): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.stevedc.thinklogic/com.stevedc.thinklogic.TowerHanoi}: java.lang.NullPointerException 01-20 22:37:46.595: E/AndroidRuntime(7350): at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:1891) 01-20 22:37:46.595: E/AndroidRuntime(7350): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992) 01-20 22:37:46.595: E/AndroidRuntime(7350): at android.app.ActivityThread.access$600(ActivityThread.java:127) 01-20 22:37:46.595: E/AndroidRuntime(7350): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158) 01-20 22:37:46.595: E/AndroidRuntime(7350): at android.os.Handler.dispatchMessage(Handler.java:99) 01-20 22:37:46.595: E/AndroidRuntime(7350): at android.os.Looper.loop(Looper.java:137) 01-20 22:37:46.595: E/AndroidRuntime(7350): at android.app.ActivityThread.main(ActivityThread.java:4441) 01-20 22:37:46.595: E/AndroidRuntime(7350): at java.lang.reflect.Method.invokeNative(Native Method) 01-20 22:37:46.595: E/AndroidRuntime(7350): at java.lang.reflect.Method.invoke(Method.java:511) 01-20 22:37:46.595: E/AndroidRuntime(7350): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 01-20 22:37:46.595: E/AndroidRuntime(7350): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 01-20 22:37:46.595: E/AndroidRuntime(7350): at dalvik.system.NativeStart.main(Native Method) 01-20 22:37:46.595: E/AndroidRuntime(7350): Caused by: java.lang.NullPointerException 01-20 22:37:46.595: E/AndroidRuntime(7350): at android.preference.PreferenceManager.getDefaultSharedPreferencesName(PreferenceManager.java:371) 01-20 22:37:46.595: E/AndroidRuntime(7350): at android.preference.PreferenceManager.getDefaultSharedPreferences(PreferenceManager.java:366) 01-20 22:37:46.595: E/AndroidRuntime(7350): at com.stevedc.thinklogic.TowerHanoi.<init>(TowerHanoi.java:42) 01-20 22:37:46.595: E/AndroidRuntime(7350): at java.lang.class.newInstanceImpl(Native Method) 01-20 22:37:46.595: E/AndroidRuntime(7350): at java.lang.class.newInstance(Class.java:1319) 01-20 22:37:46.595: E/AndroidRuntime(7350): at android.app.Instrumentation.newActivity(Instrumentation.java:1023) 01-20 22:37:46.595: E/AndroidRuntime(7350): at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:1882)
有人能指出我需要看到错误的方向吗?
解决方法
PreferenceManager.getDefaultSharedPreferences(context);
如果此处的上下文为null,则可能存在此类异常.因此,尝试将有效的上下文作为参数传递.您可以使用以下方法.
Context context = getApplicationContext();
关于指针和Pointer VS 引用的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于android – PreferenceManager.getDefaultSharedPreferences()vs getPreferences()、android – SharedPreferences ListPreference NullPointerException、android – 内部PreferenceScreen无法使用PreferenceFragmentCompat打开、android – 启动时PreferenceManager.getDefaultSharedPreferences的NullPointerException等相关内容,可以在本站寻找。
本文标签: