Навсегда отключить кнопку при нажатии кнопки

#android

#Android

Вопрос:

Я пытался полностью отключить кнопку (даже когда приложение закрыто).

Я пытался полностью отключить кнопку (даже когда приложение закрыто), используя общие настройки, и это сработало. Однако я случайно удалил файл и не могу заставить его снова работать. Я просмотрел примеры из того же вопроса, но у меня это не работает.

 com.example.new.app;

import android.content.ComponentName;
import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

SharedPreferences spStateButton;
SharedPreferences.Editor spEditor;
int clickcount=0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final EditText passWord = (EditText) findViewById(R.id.edittext);
    final Button loginButton = (Button) findViewById(R.id.button);
    spStateButton= getApplicationContext().getSharedPreferences("Button_State", 0);
    spEditor = spStateButton.edit();


    loginButton.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            if(passWord.getText().toString().equals("123456")) {
                Intent i = new Intent();
                i.setComponent(new ComponentName(MainActivity.this,Unlocked.class));
                startActivity(i);

            }else{
                passWord.setText("");
                Toast.makeText(getBaseContext(),  "Wrong", Toast.LENGTH_LONG).show();
                clickcount=clickcount 1;

            }if (clickcount==5){
                        setButtonState(false);

        }
    };

        public void setButtonState(boolean enabled) {
            spEditor.putBoolean("btn_state", enabled);
            loginButton.setEnabled(getButtonState());

            spEditor.commit();
        }

        public boolean getButtonState(){
            return spStateButton.getBoolean("btn_state", true);
        }



    });
  

}}

Комментарии:

1. Я знаю, что это дубликат, но ни одно из решений не сработало для меня

2. и приведенный выше код является моим основным действием

3. Можете ли вы показать stacktrace?

4. мой stacktrace длинный, поэтому я вставил его в документ word

5. docs.google.com/document/d/…

Ответ №1:

Вы забыли позвонить loginButton.setEnabled(getButtonState()); при запуске приложения. Кроме того, вам необходимо переместить setButtonState и getButtonState из метода onCreate().

Вот правильный MainActivity:

 import android.content.ComponentName;
import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    SharedPreferences spStateButton;
    SharedPreferences.Editor spEditor;
    int clickcount = 0;

    Button loginButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final EditText passWord = (EditText) findViewById(R.id.edittext);
        loginButton = (Button) findViewById(R.id.button);
        spStateButton = getApplicationContext().getSharedPreferences("Button_State", 0);
        spEditor = spStateButton.edit();

        loginButton.setEnabled(getButtonState()); // You forgot it :)

        loginButton.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                if (passWord.getText().toString().equals("123456")) {
                    Intent i = new Intent();
                    i.setComponent(new ComponentName(MainActivity.this, Unlocked.class));
                    startActivity(i);

                } else {
                    passWord.setText("");
                    Toast.makeText(getBaseContext(), "Wrong", Toast.LENGTH_LONG).show();
                    clickcount = clickcount   1;

                }
                if (clickcount == 5) {
                    setButtonState(false);

                }
            }

        });
    }

    public void setButtonState(boolean enabled){
        spEditor.putBoolean("btn_state", enabled);
        loginButton.setEnabled(getButtonState());

        spEditor.commit();
    }

    public boolean getButtonState() {
        return spStateButton.getBoolean("btn_state", true);
    }
}
  

Комментарии:

1. когда я делаю это, он говорит «не удается разрешить метод getButtonState()»

2. Вы также должны переместить setButtonState и getButtonState из метода onCreate(). Смотрите обновленный код.

3. когда я запускаю приложение, кнопка отключается, даже не нажав 5 раз.

4. Да, это потому, что вы нажимали 5 раз до этого, и значение sharedpreferences было изменено на false. Попробуйте переустановить приложение (сначала удалите), чтобы восстановить количество нажатий.

Ответ №2:

Ваше состояние не зафиксировано, поэтому вы работаете со старым значением. Вы фиксируете после настройки состояния кнопки. Вы можете повторно использовать значение, которое вы устанавливаете для следующего состояния кнопки

 public void setButtonState(boolean enabled) {
    spEditor.putBoolean("btn_state", enabled);
    loginButton.setEnabled(enabled);

    spEditor.commit();
}
  

Вы просили объяснений:

  1. Вы устанавливаете новое значение btn_state в редакторе общих настроек
  2. Вы хотите прочитать это значение из общих настроек ( spStateButton.getBoolean("btn_state", true); ), но его там еще нет, потому что вы его не зафиксировали.
  3. Вы фиксируете значение / записываете значение в общие настройки, это выполняется асинхронно.

Комментарии:

1. Я не силен в кодировании, поэтому не могли бы вы, пожалуйста, объяснить мне это

2. @DavidKim в основном вы читаете настройки, которые еще не были обновлены

Ответ №3:

 If(isDisabled()){
button.setEnabled(false);}
isDisabled(){
// get state from shrdPref
}
  

Комментарии:

1. Я только что заменил setButtonState(false);

2. с помощью кнопки. Установлено значение «Отключено» (false)