#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")