Для работы кнопки Android Studio нужно дважды нажать кнопку (отличается от проблем других людей) - PullRequest
1 голос
/ 06 апреля 2020

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

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

XML Код:

  <ImageButton
    android:id="@+id/plusCal"
    android:layout_width="38dp"
    android:layout_height="32dp"
    android:layout_marginStart="120dp"
    android:layout_marginBottom="124dp"
    android:background="@color/white"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:srcCompat="@drawable/plus" />

Код активности:

publi c класс MainActivity расширяет AppCompatActivity {

//create private ImageButton Object
private ImageButton setting_button;
TextView Cremaining, Premaining;
EditText MinusCal, MinusPro;
ImageButton plusCal, plusPro;

String calData, proData;
SharedPreferences prefs;

int calint, proint, Calinput, ProInput;
String Result;



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

    prefs = PreferenceManager.getDefaultSharedPreferences(this);
    calData = prefs.getString("Cal_Total","0");
    proData = prefs.getString("Pro_Total","0");


    //retrieve TxtView using findviewbyID
    Cremaining = (TextView) findViewById(R.id.RemainingCal);
    Premaining = (TextView) findViewById(R.id.RemainingPro);

    //Retrieve EditButton using findviewbyID

    MinusCal = (EditText)findViewById(R.id.EditCal) ;
    MinusPro = (EditText)findViewById(R.id.EditPro);

    //Retrieve Button using findViewbyID
    plusCal = (ImageButton)findViewById(R.id.plusCal);
    plusPro = (ImageButton)findViewById(R.id.plusProtein);



    //Set Protein and Calories either from settings or update from result
        Cremaining.setText(calData);
        Premaining.setText(proData);

    plusCal.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {

            SharedPreferences.Editor editor = prefs.edit();

            //Subtract Calories from Input calories, then set total to calData and save and set text
            Calinput = Integer.parseInt(MinusCal.getText().toString());
            calint = Integer.parseInt(calData);
            calint -= Calinput;
            calData = String.valueOf(calint);
            editor.putString("Cal_Total", calData);
            calData = prefs.getString("Cal_Total","0");
            Cremaining.setText(calData);




            editor.apply();

        }
                                   });

Игнорируя форматирование и избыточные переменные, я хочу очистить код, как только у меня возникнет проблема, то же самое с любая обработка ошибок (попытка ловит)

ОБНОВЛЕНИЕ: Я понял это: редактор, я использую .apply () вместо коммита, и я использую его поздно в вызове выполнения, поэтому я установил значение сохраните его в общих настройках, а затем вызовите общие настройки без фиксации в правильном потоке, в результате чего он тоже получит старое значение.

1 Ответ

0 голосов
/ 06 апреля 2020

Когда вы редактируете editText, это представление имеет фокус. Таким образом, первое нажатие приведет к потере фокуса (курсор редактирования исчезнет), а второе нажатие может go к кнопке или любому другому виду.

Вы можете сделать editText.setOnFocusChangeListener, а затем, если focus == false вы можете запустить нужное действие.

Или вы можете сделать editText.addTextChangedListener() и переопределить нужные вам методы. Вы можете запустить нужное вам действие, и, когда пользователь введет значение, вы можете автоматически выполнить расчет. В этом случае кнопки не нужны.

Или вы можете editText.setOnKeyListener() и переопределить onKey() и определить, когда нажата клавиша ввода, сделать что-то вроде этого:

if ((keyevent.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER))
{
 //perform the action you want
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...