【问题标题】:Change Floating Action Button Background更改浮动操作按钮背景
【发布时间】:2017-03-27 01:54:35
【问题描述】:

我正在使用一个浮动操作按钮,单击它时它的图像会发生变化。我有一个标志,并将其存储在共享首选项中。为真时图标变为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);

}


}

【问题讨论】:

    标签: java android sharedpreferences floating-action-button


    【解决方案1】:

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

    首先,您需要将每个内容的评分数据存储到某个位置(本地或远程数据库、SharedPreferences、文件等)

    启动 ReadActivity 后,

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

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

    编辑:

    在使用 getSharedPreferences() 之前尝试使用 getApplicationContext() 您也可以尝试 editor.apply() 而不是 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);
    
    }
    

    【讨论】:

    • 我的想法和你提到的一样,当我点击它时,FAB图标会改变,没有问题。当我在活动开始时调用getRate() 时,它会自动返回sharedPreference 的默认值。
    • 也不起作用。感谢您的帮助,我会尝试不同的技巧。
    【解决方案2】:

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

    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() 时图标会发生变化
    【解决方案3】:

    试试这个代码:

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

    【讨论】:

    • 但我想在应用启动时更改图标
    • 您可以在 ReadActivity fab.setBackgroundTintList(ColorStateList.valueOf(Color .parseColor("#33691E"))); 中使用此代码;
    • 我在问一个完全不同的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 2018-09-18
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多