Попытка добавления в список массивов для разных действий при каждом нажатии кнопки

#java #android #android-studio

#java #Android #android-studio

Вопрос:

Так что просто для практики я создал приложение для вычисления теоремы Пифагора. Я хочу, чтобы каждый ответ, который я получаю, сохранялся в другом действии (страница «история»). Я пытаюсь использовать intents для отправки / получения arraylist и элементов. Я получаю самую последнюю, но она перезаписывается после каждого нажатия кнопки.

 package com.example.hypnotenusecalculatorrebuild;

import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {


    //ToDo history button is broken. doesn't display listview when pressed.
    public void toHistory(View view) {

//        Intent intent = new Intent(getApplicationContext(), HistoryActivity.class);
//
//        startActivity(intent);

    }

    public void findHypno(View view) {

        Log.i("Info", "button pressed");

        EditText editTextNumberA = (EditText) findViewById(R.id.editTextNumberA);
        EditText editTextNumberB = (EditText) findViewById(R.id.editTextNumberB);
        TextView textViewAnswer = (TextView) findViewById(R.id.textViewAnswer);

        String message;
        String cSquared;

        if (editTextNumberA.getText().toString().isEmpty() || editTextNumberB.getText().toString().isEmpty()) {

            message = "Please enter a number for each dimension";
            Toast.makeText(this, message, Toast.LENGTH_LONG).show();

        } else {
            Number numberA = new Number();
            Number numberB = new Number();
            Number numberC = new Number();

            numberA.number = Double.parseDouble(editTextNumberA.getText().toString());
            numberB.number = Double.parseDouble(editTextNumberB.getText().toString());

            numberA.squareNumber();
            numberB.squareNumber();
            numberC.number = numberA.number   numberB.number;
            numberC.squareRoot();

            Log.i("test numberA", String.valueOf(numberA.number));
            Log.i("test numberB", String.valueOf(numberB.number));
            Log.i("test numberC", String.valueOf(numberC.number));

            cSquared = Double.toString(numberC.number);

            textViewAnswer.setText(cSquared);

            ArrayList<String> historyList = new ArrayList<String>();
            historyList.add("test");

            Intent intent = new Intent(getApplicationContext(), HistoryActivity.class);
            intent.putExtra("answer", cSquared);
            intent.putStringArrayListExtra("arrayList", historyList);

            startActivity(intent);

        }

    }

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




    }
}  

 package com.example.hypnotenusecalculatorrebuild;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;
import java.util.function.ToDoubleBiFunction;

public class HistoryActivity extends AppCompatActivity {

    public void back(View view) {

        finish();
    }

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

        Intent getList = getIntent();
        ArrayList<String> historyList = getList.getStringArrayListExtra("arrayList");
        historyList.add(getList.getStringExtra("answer"));

        ListView listViewHistory = (ListView) findViewById(R.id.listViewHistory);
        ArrayAdapter historyListArrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, historyList);
        listViewHistory.setAdapter(historyListArrayAdapter);


        // ToDo - intent isn't working as attended, only saves one item and gets overwritten each time
        //Intent historyIntent = getIntent();

        // get extra needs a name from put extra
//        String testGetIntent = historyIntent.getStringExtra("answer");
//        Log.i("testIntentString", testGetIntent);
//        historyList.add(historyIntent.getStringExtra("answer"));
    }
}  

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

1. ДА. Каждый раз, когда вы запускаете новое действие истории, вы даете ему последний ответ u (только строка cSquared). После этого вы отключите действие истории, чтобы вернуться к MainActivity.

2. ArrayList<String> historyList = new ArrayList<String>(); Не создавайте новый список каждый раз. Просто сделайте это один раз n onCreate. Затем добавляйте каждый раз новый ответ и передавайте этот список в журнал действий.

3. Даже тогда… вы не будете готовы к возвращению из истории действий, я думаю, вам не следует создавать новый список, а использовать старый. Предстоит многое сделать…

4. Вы можете сохранять данные в локальной базе данных, каждое действие сможет извлекать их оттуда с помощью согласованного API. developer.android.com/topic/libraries/architecture/room

Ответ №1:

здесь другой подход. создайте общедоступный интерфейс в отдельном файле с именем «extensions» или что-то еще и инициализируйте там свой arraylist следующим образом:

 public interface ext {
    ArrayList<String> myArray = new ArrayList<String>();
}
  

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

Доступ к массиву таким образом:

 ext.myArray.add("new item")