1

在一个Android手机的我得到一个NullPointerException和另一个我不是。我试图为我的隐私设置保存多个复选框状态。正如我在其中一款手机上所说的那样,它可以正常工作,将其保存到sharedPreferences中,但在我的主手机上,只要打开“活动”,它就会崩溃。任何人都看到这个问题?获取NullPointerException与复选框

public class PrivacySettings extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener { 


CheckBox showAge,showLocation,showRelationship,showGender,showFacebookButton; 

String TAG = getPackageName(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_privacy_settings); 




    showAge=(CheckBox)findViewById(R.id.cbShowAge); 
    showAge.setChecked(getFromSP("cbShowAge")); 
    showAge.setOnCheckedChangeListener(this); 
    showLocation=(CheckBox)findViewById(R.id.cbShowLocation); 
    showLocation.setChecked(getFromSP("cbShowLocation")); 
    showLocation.setOnCheckedChangeListener(this); 
    showRelationship=(CheckBox)findViewById(R.id.cbShowRelationshipStatus); 
    showRelationship.setChecked(getFromSP("cbShowRelationship")); 
    showRelationship.setOnCheckedChangeListener(this); 
    showGender=(CheckBox)findViewById(R.id.cbShowGender); 
    showGender.setChecked(getFromSP("cbShowGender")); 
    showGender.setOnCheckedChangeListener(this); 
    showFacebookButton=(CheckBox)findViewById(R.id.cbShowFacebookLink); 
    showFacebookButton.setChecked(getFromSP("cbShowFacebookButton")); 
    showFacebookButton.setOnCheckedChangeListener(this); 




    setTitle("Privacy Settings"); 


    Toolbar toolbar = (Toolbar) findViewById(R.id.app_bar); 
    setSupportActionBar(toolbar); 

    getSupportActionBar().setDisplayShowHomeEnabled(true); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 


} 

private boolean getFromSP(String key){ 
    SharedPreferences preferences = getApplicationContext().getSharedPreferences(TAG, android.content.Context.MODE_PRIVATE); 
    return preferences.getBoolean(key, false); 
} 
private void saveInSp(String key,boolean value){ 
    SharedPreferences preferences = getApplicationContext().getSharedPreferences(TAG, android.content.Context.MODE_PRIVATE); 
    SharedPreferences.Editor editor = preferences.edit(); 
    editor.putBoolean(key, value); 
    editor.apply(); 
} 




@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_privacy_settings, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 
    if (id == R.id.home) { 
     NavUtils.navigateUpFromSameTask(this); 

    } 
    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

@Override 
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

    switch(buttonView.getId()){ 
     case R.id.cbShowAge: 
      saveInSp("cbShowAge",isChecked); 
      break; 
     case R.id.cbShowLocation: 
      saveInSp("cbShowLocation",isChecked); 
      break; 

     case R.id.cbShowRelationshipStatus: 
      saveInSp("cbShowRelationship",isChecked); 
      break; 

     case R.id.cbShowGender: 
      saveInSp("cbShowGender",isChecked); 
      break; 

     case R.id.cbShowFacebookLink: 
      saveInSp("cbShowFacebookButton",isChecked); 
      break; 
    } 


} 

编辑:

我改变了标签名 “Different_name” 只是为了测试它和它的工作。任何人都可以解释为什么它的工作是这样的SharedPreferences preferences = getApplicationContext().getSharedPreferences("Different_name", android.content.Context.MODE_PRIVATE);

+0

手机是否具有不同的屏幕分辨率? – ryguy

+0

发布logcat。 –

+0

是的,但是这与什么有关?我会等一下。 – Ivan

回答

1

不知道做我得到它正确(因为没有日志现在张贴的),但是从您的评论

SharedPreferences喜好= getApplicationContext()。getSharedPreferences( “Different_name”,android.content.Context .MODE_PRIVATE);

和代码

字符串TAG = getPackageName();

看来你的共享首选项文件名作为返回null一些设备上,即使用getPackageName()

TAG == NULL

如果您改变TAG你的活动名称和它需要公开和静态:

public stat ic final String TAG = PrivacySettings.class.getSimpleName();

,你可以在任何地方使用它作为:

SharedPreferences喜好=的getContext()getSharedPreferences(PrivacySettings.TAG,Context.MODE_PRIVATE);

总之,似乎出于某种原因所以只使用这将永远任何设备上,例如失败的值getPackageName()失败当前班级名称