更改浮动操作按钮背景
我正在使用浮动操作按钮,并在其点击时更改其图像。我有一个标志,我将它存储在共享偏好中。当它是真正的图标变成like.png时,当它是假图标变成dislike.png。更改浮动操作按钮背景
我想根据标志变量,但是当应用程序开始的图标是默认这是true.png
改变它的图标怎样可以通过设置共享偏好的图标?
public class ReadActivity extends AppCompatActivity {
private FloatingActionButton fab;
private boolean flag;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_read);
fab = (FloatingActionButton) findViewById(R.id.fab);
getRate(getWindow().getDecorView().getRootView());
if(flag==false){
fab.setImageResource(R.drawable.like);
}
else if(flag==true){
fab.setImageResource(R.drawable.dislike);
}
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getRate(v);
if(flag==false) {
rateUp();
Snackbar.make(v, "Vote +1", Snackbar.LENGTH_LONG).show();
saveRate(v, true);
fab.setImageResource(R.drawable.dislike);
}
else if(flag==true){
rateDown();
Snackbar.make(v, "Vote -1", Snackbar.LENGTH_LONG).show();
saveRate(v, false);
fab.setImageResource(R.drawable.like);
}
}
});
}
public void rateUp() {};
public void rateDown() {};
public void saveRate(View view, boolean flag){
SharedPreferences sharedPreferences = getSharedPreferences("Rates", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean(id, flag);
editor.commit();
}
public void getRate(View view){
SharedPreferences sharedPreferences = getSharedPreferences("Rates", MODE_PRIVATE);
flag = sharedPreferences.getBoolean(id, false);
}
}
试试这个代码:
public class ReadActivity extends AppCompatActivity {
private FloatingActionButton fab;
private string getSharedPreferencesId="getSharedPreferencesId";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_read);
fab = (FloatingActionButton) findViewById(R.id.fab);
boolean flag=getRate();
if(flag==false){
fab.setImageResource(R.drawable.like);
}
else if(flag==true){
fab.setImageResource(R.drawable.dislike);
}
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
boolean flag=getRate();
if(flag==false) {
rateUp();
Snackbar.make(v, "Vote +1", Snackbar.LENGTH_LONG).show();
saveRate(true);
fab.setImageResource(R.drawable.dislike);
}
else if(flag==true){
rateDown();
Snackbar.make(v, "Vote -1", Snackbar.LENGTH_LONG).show();
saveRate(false);
fab.setImageResource(R.drawable.like);
}
}
});
}
public void rateUp() {};
public void rateDown() {};
public void saveRate(boolean flag){
SharedPreferences sharedPreferences = getSharedPreferences("Rates", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean(getSharedPreferencesId, flag);
editor.commit();
}
public boolean getRate(){
SharedPreferences sharedPreferences = getSharedPreferences("Rates", MODE_PRIVATE);
flag = sharedPreferences.getBoolean(getSharedPreferencesId, false);
}
}
我做了你的代码的一些改进:
public class ReadActivity extends AppCompatActivity {
private FloatingActionButton fab;
private boolean flag;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_read);
fab = (FloatingActionButton) findViewById(R.id.fab);
flag = getRate();
if(flag)
fab.setImageResource(R.drawable.dislike);
else
fab.setImageResource(R.drawable.like);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
flag = getRate();
if(flag) {
rateDown();
Snackbar.make(v, "Vote -1", Snackbar.LENGTH_LONG).show();
saveRate(false);
fab.setImageResource(R.drawable.like);
}
else{
rateUp();
Snackbar.make(v, "Vote +1", Snackbar.LENGTH_LONG).show();
saveRate(true);
fab.setImageResource(R.drawable.dislike);
}
}
});
}
public void rateUp() {};
public void rateDown() {};
public void saveRate(boolean flag){
SharedPreferences sharedPreferences = getSharedPreferences("Rates", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean(id, flag);
editor.commit();
}
public boolean getRate(){
SharedPreferences sharedPreferences = getSharedPreferences("Rates", MODE_PRIVATE);
boolean flag = sharedPreferences.getBoolean(id, false);
return flag;
}
}
还要检查你的activity_read.xml文件。如果你已经在你的xml FloatingActionButton上设置了一个图像,它将始终使用该图像作为默认值。
没有任何改变,仍然是一样的。当我开始活动时,getRate()返回它的默认值。但是,当我调用'onClick()'时,图标发生了变化 – Burak
我会告诉你的逻辑。假设你有许多不同的内容,并且你想保存每个内容的评价数据。
首先,你需要你的每一个内容的评级数据存储到某个地方(本地或远程数据库,SharedPreferences,文件等)
开始你ReadActivity后,
- 设置你的标志为缺省值你想成为。
- 将您的FAB图标设置为默认值。
- 从您之前存储的位置获取您的相关内容评级数据(布尔值)。
- 检查您的评分数据是真是假。
- 如果这是真的设置你的图标R.drawable.dislike,否则设置R.drawable.like
- 当您单击的FAB,改变你的标志值和FAB图标
- 保存新的布尔值给你存储在哪里之前
重要的一点是,您必须为每个内容拥有不同的值。
编辑:
尝试使用getSharedPreferences() 你也可以尝试editor.apply(之前使用getApplicationContext()),而不是editor.commit();
commit()和apply()做同样的工作,但有两个不同,apply()异步工作和commit()返回布尔值。
public void saveRate(View view, boolean flag){
SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("Rates", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean(id, flag);
editor.apply();
}
public void getRate(View view){
SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("Rates", MODE_PRIVATE);
flag = sharedPreferences.getBoolean(id, false);
}
但我想改变的图标时,应用程序启动 – Burak
您可以在ReadActivity fab.setBackgroundTintList使用此代码(ColorStateList.valueOf(彩色 .parseColor( “#33691E”))); –
我在问一个完全不同的问题 – Burak