2016-11-13 138 views
1

我正在使用浮动操作按钮,并在其点击时更改其图像。我有一个标志,我将它存储在共享偏好中。当它是真正的图标变成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); 

} 


} 

回答

0

试试这个代码:

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); 
} 


} 
+0

但我想改变的图标时,应用程序启动 – Burak

+0

您可以在ReadActivity fab.setBackgroundTintList使用此代码(ColorStateList.valueOf(彩色 .parseColor( “#33691E”))); –

+0

我在问一个完全不同的问题 – Burak

0

我做了你的代码的一些改进:

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上设置了一个图像,它将始终使用该图像作为默认值。

+0

没有任何改变,仍然是一样的。当我开始活动时,getRate()返回它的默认值。但是,当我调用'onClick()'时,图标发生了变化 – Burak

0

我会告诉你的逻辑。假设你有许多不同的内容,并且你想保存每个内容的评价数据。

首先,你需要你的每一个内容的评级数据存储到某个地方(本地或远程数据库,SharedPreferences,文件等)

开始你ReadActivity后,

  1. 设置你的标志为缺省值你想成为。
  2. 将您的FAB图标设置为默认值。
  3. 从您之前存储的位置获取您的相关内容评级数据(布尔值)。
  4. 检查您的评分数据是真是假。
  5. 如果这是真的设置你的图标R.drawable.dislike,否则设置R.drawable.like
  6. 当您单击的FAB,改变你的标志值和FAB图标
  7. 保存新的布尔值给你存储在哪里之前

重要的一点是,您必须为每个内容拥有不同的值。

编辑:

尝试使用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); 

} 
+0

当我点击它时,我认为和做了与您所提及的相同的操作,并且FAB图标发生了更改,这没有任何问题。当我在活动开始时调用getRate()时,它会自动返回sharedPreference的默认值。 – Burak

+0

也不工作。谢谢你的帮助,我会尝试一种不同的伎俩。 – Burak