编辑其他类别中的SharedPreference值

时间:2018-09-18 13:40:45

标签: java android sharedpreferences android-context

我尝试更改SharedPreference在我的适配器中设置的MainActivity。因此,我认为使用MainActivity的实例可以从那里访问和更改它。当单击一个项目时,会弹出一个对话框,然后在确认时,变量应存储在SharedPreference中。不幸的是,我在应编辑此变量的部分出现错误:

  

android.content.SharedPreferences $ Editor   空对象引用上的android.content.SharedPreferences.edit()'

MainActivity

public class MainActivity extends AppCompatActivity {

    SharedPreferences favE;
    int x;

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

        favE = MainActivity.this.getSharedPreferences("myFavEName",
                Context.MODE_PRIVATE);
        x = favE.getInt("favKey", 0);

    }

    public int getFavE(){
        return x;
    }
}

我的适配器:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {

    Context context;

    List<GetDataAdapter> getDataAdapter;

    MainActivity ma = new MainActivity();

    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {

        GetDataAdapter getDataAdapter1 =  getDataAdapter.get(position);

        final int a = getDataAdapter1.getId();

        int x = ma.getFavE();

        holder.cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 addDialog(a);       
        });
    }


    public void addDialog(final int a) {
        Context context = this.context;
        LayoutInflater inflater = LayoutInflater.from(this.context);

        AlertDialog.Builder builder = new AlertDialog.Builder(context);

        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {

            }
        });

        builder.setPositiveButton("Exit Group", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {          
                ma.favE.edit().putInt("favKey", 0)
                        .apply();
            }
        });
        builder.show();
    }
}

1 个答案:

答案 0 :(得分:3)

您不需要MainActivity的实例。您可以指定一个构造函数,该构造函数将仅从活动中获取上下文以使用“共享”首选项。因此,当您创建适配器时,会将MainActivity上下文提供给适配器。我认为在您的情况下,因为您正在创建新实例,所以您在正确初始化MainActivity之前使用上下文。因此它给您错误的上下文。 您的构造函数将是这样

public RecyclerViewAdapter(Context context) {
        this.context = context;
    }