【问题标题】:Shared preferences button switch共享偏好按钮开关
【发布时间】:2017-01-27 20:55:45
【问题描述】:

我正在尝试使用共享首选项切换按钮,这样当我打开我的应用程序时,就会显示相应的按钮。 这是我设置和获取共享首选项的代码:

private void setRequestUpdatesButtonState(boolean state) {
    PreferenceManager.getDefaultSharedPreferences(this)
            .edit()
            .putBoolean(Constants.PREF_IS_BUTTON_PRESSED, state)
            .apply();
}

private boolean getRequestUpdatesButtonState() {
    return PreferenceManager.getDefaultSharedPreferences(this)
            .getBoolean(Constants.PREF_IS_BUTTON_PRESSED, false);
}

然后在 onCreate 方法中,我检查共享首选项以显示适当的按钮:

if(getRequestUpdatesButtonState()) {
        mRequestRemoveUpdates.setCircleRadius(34);
        mRequestRemoveUpdates.setImageResource(R.drawable.ic_cancel);
    }
    else {
        mRequestRemoveUpdates.setCircleRadius(34);
        mRequestRemoveUpdates.setImageResource(R.drawable.ic_start);
    }

同样在 onClick 方法中,当按钮被点击时,我会根据情况更改共享首选项,以及按钮图像本身:

if(getRequestUpdatesButtonState()) {
      boolean updatesRequested = true;
      setRequestUpdatesButtonState(updatesRequested);
      mRequestRemoveUpdates.setCircleRadius(34);
                     mRequestRemoveUpdates.setImageResource(R.drawable.ic_cancel);
            }
else {
     boolean updatesRequested = false;
     setRequestUpdatesButtonState(updatesRequested);
     mRequestRemoveUpdates.setCircleRadius(34);
                mRequestRemoveUpdates.setImageResource(R.drawable.ic_start);
}

但它不起作用。 显然,我需要摆脱代码重复,但我一开始正在努力使其正常运行,我正在努力实现;然后我会清理它。

【问题讨论】:

  • 似乎是一个逻辑问题。您希望您的开关切换,但不知何故您并没有在您的 onClick 方法中真正“切换”它。在 onClick 的 if..else.. 语句中反转你的逻辑并尝试。
  • 我使用 CircledImageView 作为按钮,在我的 getRequestUpdatesButtonState 中我使用 false 作为默认值,然后在 onClick 中我将共享首选项从 false 更改为 true,反之亦然,我也更改了按钮图像: mRequestRemoveUpdates.setImageResource(R.drawable.ic_cancel);或 mRequestRemoveUpdates.setImageResource(R.drawable.ic_start);更改按钮图像用作切换
  • 不管你使用什么默认值。在您的onClick 方法中,您使用getRequestUpdatesButtonState()SharedPreferences 读取值。它告诉您您当前的状态是true(或错误),并且您仍在尝试使用相同的状态对其进行更新。简而言之,您没有切换它。
  • 好的,那么使用这样的东西是否正确: boolean something = !getRequestUpdatesButtonState() 然后将该值放入: setRequestUpdatesButtonState(something) ,然后添加相反的布尔值,或者我还是错了吗?
  • 试试就知道了。记得反转你的View 逻辑以获得正确的视觉反馈。

标签: android sharedpreferences


【解决方案1】:

我不知道您的确切实现是什么,但我已经实现了您想要的类似功能。此代码用于登录表单,布局由两个EditText 用于用户名和密码,记住我ImageView 和登录Button。如果用户点击(检查)记住我,那么登录凭据应该保持不变,否则它不应该保持不变,因此它将更改ImageViewdrawable。所以每当用户打开应用程序时,它都会在@上显示正确的图像987654326@。这是使用SharedPreferences

完成的

xml:

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:id="@+id/login_form"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:orientation="vertical">

        <EditText
            android:id="@+id/etUserName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:hint="Username"
            android:padding="10dp" />

        <EditText
            android:id="@+id/etPassword"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Password"
            android:padding="10dp" />

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@id/etPassword"
            android:orientation="horizontal">

            <ImageView
                android:id="@+id/ivRememberMe"
                android:layout_width="35dp"
                android:layout_height="35dp"
                android:layout_centerVertical="true"
                android:src="@drawable/holo_circle" />

            <TextView
                android:id="@+id/tvRememberMe"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_marginLeft="6dp"
                android:layout_toRightOf="@+id/ivRememberMe"
                android:text="Remember Me"
                android:textAppearance="?android:attr/textAppearanceSmall" />
        </RelativeLayout>

        <Button
            android:id="@+id/btnSignIn"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="15dp"
            android:text="Sign in"
            android:textColor="@android:color/white" />
    </LinearLayout>

</RelativeLayout>

MainActivity:

  public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private ImageView ivRememberMe;
    private Button btnLogin;
    private EditText etUserName, etPassword;
    private String userName, password;
    private static boolean rememberMe;
    String USERNAME = "username";
    String PASSWORD = "password";
    String REMEMBER_ME = "remember me";

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

        initValues();
    }

    private void initValues() {
        try {
            btnLogin = (Button) findViewById(R.id.btnSignIn);
            btnLogin.setOnClickListener(this);

            etUserName = (EditText) findViewById(R.id.etUserName);
            etPassword = (EditText) findViewById(R.id.etPassword);

            //Persist credentials, if remember me is checked
            SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
            if (pref.contains(USERNAME) && pref.contains(PASSWORD)) {
                etUserName.setText(pref.getString(USERNAME, ""));
                etPassword.setText(pref.getString(PASSWORD, ""));
                if (pref.getBoolean(REMEMBER_ME, true)) {
                    ((ImageView) findViewById(R.id.ivRememberMe)).setImageResource(R.drawable.checkbox_marked_circle);
                }
            }
            ivRememberMe = (ImageView) findViewById(R.id.ivRememberMe);
            ivRememberMe.setOnClickListener(this);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Override
    public void onClick(View v) {
        try {
            switch (v.getId()) {
                case R.id.btnSignIn:
                    validateCredentials();
                    onLogin();
                    break;
                case R.id.ivRememberMe:
                    rememberMe = !rememberMe;
                    ((ImageView) findViewById(R.id.ivRememberMe)).setImageResource(rememberMe ? R.drawable.checkbox_marked_circle : R.drawable.holo_circle);
                    checkPersistCredentials(etUserName.getText().toString().trim(), etPassword.getText().toString());
                    break;
                default:
                    break;

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void validateCredentials() {
        try {
            userName = etUserName.getText().toString();
            password = etPassword.getText().toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public void onLogin() {
        //implement login request
    }


    private void checkPersistCredentials(String userName, String password) {
        rememberMe(userName, password, this);
    }

    public void rememberMe(final String username, String password, Context context) {
        try {

            SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
            SharedPreferences.Editor edit = sharedPreferences.edit();
            if (rememberMe) {
                if (username.isEmpty() && password.isEmpty()) {

                } else {
                    edit.putString(USERNAME, username);
                    edit.putString(PASSWORD, password);
                    edit.putBoolean(REMEMBER_ME, true);
                    edit.commit();
                }
            } else {
                edit.clear();
                edit.commit();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

但是,您可以使用此代码作为参考来实现您的特定逻辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 2013-03-15
    相关资源
    最近更新 更多