android - 如何在父布局上丢失数据的情况下从子布局移动到父布局?以及如何优化我的代码?
问题描述
我是android开发的新手。以下是我的名为“我的水果列表”的 Android 应用程序的代码,其中 Main Activity 在“文本视图”中显示选择的水果,这些水果在“滚动视图”内的“线性布局(垂直方向)”中排列,使用从第二个布局中选择当前主布局底部的“添加水果”按钮。该程序按预期运行,但我有两个问题:
我的第一个问题是,因为我已将 Main Activity 作为第二个布局的父 Activity,该布局作为子 Activity 工作。但是,当我使用左上角的左箭头从子级移动到父级时,主活动文本视图中的所有数据都消失了。我已经覆盖了 onSaveInstance 和 onRestoreInstance 以在屏幕旋转时保留主要活动的数据,但是当我使用左上角的箭头从子级移动到父级时,它会消失那些“文本视图”中存在的所有数据。为什么?
我的第二个问题是,我怎样才能优化我的代码意味着让它更短更清晰?
非常感谢!
MainActivity.java:
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = "MainActivity";
private Button button_addItem;
private TextView item1;
private TextView item2;
private TextView item3;
private TextView item4;
private TextView item5;
private TextView item6;
private TextView item7;
private TextView item8;
private TextView item9;
private TextView item10;
private static final int CHOSEN_FRUIT = 1;
//string keys for onSaveInstance and onRestoreInstance
private static final String ITEM_1_KEY = "item1key";
private static final String ITEM_2_KEY = "item2key";
private static final String ITEM_3_KEY = "item3key";
private static final String ITEM_4_KEY = "item4key";
private static final String ITEM_5_KEY = "item5key";
private static final String ITEM_6_KEY = "item6key";
private static final String ITEM_7_KEY = "item7key";
private static final String ITEM_8_KEY = "item8key";
private static final String ITEM_9_KEY = "item9key";
private static final String ITEM_10_KEY = "item10key";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button_addItem = findViewById(R.id.button_addItem);
item1 = findViewById(R.id.textView_item1);
item2 = findViewById(R.id.textView_item2);
item3 = findViewById(R.id.textView_item3);
item4 = findViewById(R.id.textView_item4);
item5 = findViewById(R.id.textView_item5);
item6 = findViewById(R.id.textView_item6);
item7 = findViewById(R.id.textView_item7);
item8 = findViewById(R.id.textView_item8);
item9 = findViewById(R.id.textView_item9);
item10 = findViewById(R.id.textView_item10);
button_addItem.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, AvailableItems.class);
startActivityForResult(intent, CHOSEN_FRUIT);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CHOSEN_FRUIT) {
if (resultCode == RESULT_OK) {
if (item1.getText().toString().equalsIgnoreCase("empty"))
item1.setText(data.getStringExtra(AvailableItems.FRUIT_ID));
else if (item2.getText().toString().equalsIgnoreCase("empty"))
item2.setText(data.getStringExtra(AvailableItems.FRUIT_ID));
else if (item3.getText().toString().equalsIgnoreCase("empty"))
item3.setText(data.getStringExtra(AvailableItems.FRUIT_ID));
else if (item4.getText().toString().equalsIgnoreCase("empty"))
item4.setText(data.getStringExtra(AvailableItems.FRUIT_ID));
else if (item5.getText().toString().equalsIgnoreCase("empty"))
item5.setText(data.getStringExtra(AvailableItems.FRUIT_ID));
else if (item6.getText().toString().equalsIgnoreCase("empty"))
item6.setText(data.getStringExtra(AvailableItems.FRUIT_ID));
else if (item7.getText().toString().equalsIgnoreCase("empty"))
item7.setText(data.getStringExtra(AvailableItems.FRUIT_ID));
else if (item8.getText().toString().equalsIgnoreCase("empty"))
item8.setText(data.getStringExtra(AvailableItems.FRUIT_ID));
else if (item9.getText().toString().equalsIgnoreCase("empty"))
item9.setText(data.getStringExtra(AvailableItems.FRUIT_ID));
else if (item10.getText().toString().equalsIgnoreCase("empty"))
item10.setText(data.getStringExtra(AvailableItems.FRUIT_ID));
else
Toast.makeText(this, "List is full!", Toast.LENGTH_SHORT).show();
// Log.d("TESTMESSAGE", "onActivityResult: " + data.getStringExtra(AvailableItems.FRUIT_ID));
}
}
}
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
outState.putString(ITEM_1_KEY, item1.getText().toString());
outState.putString(ITEM_2_KEY, item2.getText().toString());
outState.putString(ITEM_3_KEY, item3.getText().toString());
outState.putString(ITEM_4_KEY, item4.getText().toString());
outState.putString(ITEM_5_KEY, item5.getText().toString());
outState.putString(ITEM_6_KEY, item6.getText().toString());
outState.putString(ITEM_7_KEY, item7.getText().toString());
outState.putString(ITEM_8_KEY, item8.getText().toString());
outState.putString(ITEM_9_KEY, item9.getText().toString());
outState.putString(ITEM_10_KEY, item10.getText().toString());
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
item1.setText(savedInstanceState.get(ITEM_1_KEY).toString());
item2.setText(savedInstanceState.get(ITEM_2_KEY).toString());
item3.setText(savedInstanceState.get(ITEM_3_KEY).toString());
item4.setText(savedInstanceState.get(ITEM_4_KEY).toString());
item5.setText(savedInstanceState.get(ITEM_5_KEY).toString());
item6.setText(savedInstanceState.get(ITEM_6_KEY).toString());
item7.setText(savedInstanceState.get(ITEM_7_KEY).toString());
item8.setText(savedInstanceState.get(ITEM_8_KEY).toString());
item9.setText(savedInstanceState.get(ITEM_9_KEY).toString());
item10.setText(savedInstanceState.get(ITEM_10_KEY).toString());
}}
可用项目(第二个活动):
package com.xafak.fruitshoppinglist;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class AvailableItems extends AppCompatActivity {
private Button bananaImage;
private Button grapeImage;
private Button appleImage;
private Button watermelonImage;
private Button pineappleImage;
private Button avocadoImage;
private Button cherryImage;
private Button cirtusImage;
private Button strawberryImage;
private Button pomegranateImage;
public static final String FRUIT_ID = "fruit_id";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_available_items);
bananaImage = findViewById(R.id.bananas);
grapeImage = findViewById(R.id.grapes);
appleImage = findViewById(R.id.apple);
watermelonImage = findViewById(R.id.watermelon);
pineappleImage = findViewById(R.id.pineapple);
avocadoImage = findViewById(R.id.avocado);
cherryImage = findViewById(R.id.cherry);
cirtusImage = findViewById(R.id.citrus);
strawberryImage = findViewById(R.id.strawberry);
pomegranateImage = findViewById(R.id.pomegranate);
}
public void addItemToList(View v) {
switch (v.getId()) {
case R.id.bananas:
configureIntent("Bananas");
break;
case R.id.grapes:
configureIntent("Grapes");
break;
case R.id.apple:
configureIntent("Apple");
break;
case R.id.watermelon:
configureIntent("Watermelon");
break;
case R.id.pineapple:
configureIntent("Pineapple");
break;
case R.id.avocado:
configureIntent("Avocado");
break;
case R.id.cherry:
configureIntent("Cherry");
break;
case R.id.citrus:
configureIntent("Citrus");
break;
case R.id.strawberry:
configureIntent("Strawberry");
break;
case R.id.pomegranate:
configureIntent("Pomegranate");
break;
default:
}
}
public void configureIntent(String fruitName) {
Intent replyIntent = new Intent();
replyIntent.putExtra(FRUIT_ID, fruitName);
setResult(RESULT_OK, replyIntent);
finish();
} }
安卓清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xafak.fruitshoppinglist">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".AvailableItems"
android:label="Available Fruits"
android:parentActivityName=".MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity" />
</activity>
</application>
</manifest>
活动主.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ScrollView
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="8dp"
android:foregroundGravity="center_vertical|clip_horizontal|center"
app:layout_constraintBottom_toTopOf="@+id/button_addItem"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imageView2">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/textView_item1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@string/empty"
android:textSize="45sp" />
<TextView
android:id="@+id/textView_item2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@string/empty"
android:textSize="45sp" />
<TextView
android:id="@+id/textView_item3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@string/empty"
android:textSize="45sp" />
<TextView
android:id="@+id/textView_item4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@string/empty"
android:textSize="45sp" />
<TextView
android:id="@+id/textView_item5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@string/empty"
android:textSize="45sp" />
<TextView
android:id="@+id/textView_item6"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@string/empty"
android:textSize="45sp" />
<TextView
android:id="@+id/textView_item7"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@string/empty"
android:textSize="45sp" />
<TextView
android:id="@+id/textView_item8"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@string/empty"
android:textSize="45sp" />
<TextView
android:id="@+id/textView_item9"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@string/empty"
android:textSize="45sp" />
<TextView
android:id="@+id/textView_item10"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@string/empty"
android:textSize="45sp" />
</LinearLayout>
</ScrollView>
<Button
android:id="@+id/button_addItem"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:text="@string/select_fruit"
android:textSize="25sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<ImageView
android:id="@+id/imageView2"
android:layout_width="213dp"
android:layout_height="61dp"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/shoppingcart" />
</androidx.constraintlayout.widget.ConstraintLayout>
activity_available_items.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".AvailableItems">
<LinearLayout
android:layout_width="0dp"
android:layout_height="0dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/guideline2"
app:layout_constraintHorizontal_bias="0.39"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/guideline3">
<Button
android:id="@+id/bananas"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:onClick="addItemToList"
android:text="@string/bananas"
android:textSize="20sp" />
<Button
android:id="@+id/apple"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:onClick="addItemToList"
android:text="@string/apple"
android:textSize="20sp" />
<Button
android:id="@+id/avocado"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:onClick="addItemToList"
android:text="@string/avocado"
android:textSize="20sp" />
<Button
android:id="@+id/cherry"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:onClick="addItemToList"
android:text="@string/cherry"
android:textSize="20sp" />
<Button
android:id="@+id/citrus"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:onClick="addItemToList"
android:text="@string/citrus"
android:textSize="20sp" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="0dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/guideline2"
app:layout_constraintTop_toTopOf="@+id/guideline3">
<Button
android:id="@+id/grapes"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:onClick="addItemToList"
android:text="@string/grapes"
android:textSize="20sp" />
<Button
android:id="@+id/pineapple"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:onClick="addItemToList"
android:text="@string/pineapple"
android:textSize="20sp" />
<Button
android:id="@+id/pomegranate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:onClick="addItemToList"
android:text="@string/pomegranate"
android:textSize="20sp" />
<Button
android:id="@+id/strawberry"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:onClick="addItemToList"
android:text="@string/strawberry"
android:textSize="20sp" />
<Button
android:id="@+id/watermelon"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:onClick="addItemToList"
android:text="@string/watermelon"
android:textSize="20sp" />
</LinearLayout>
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline2"
android:layout_width="50dp"
android:layout_height="50dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintGuide_percent="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline3"
android:layout_width="0dp"
android:layout_height="0dp"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintGuide_percent="0.3"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/imageView"
android:layout_width="583dp"
android:layout_height="97dp"
android:contentDescription="@string/fruit_image"
app:layout_constraintBottom_toTopOf="@+id/guideline3"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/fruitmarket" />
</androidx.constraintlayout.widget.ConstraintLayout>
解决方案
不需要 onSaveInstanceState 或 onRestoreState。
使用一个数组列表,它为您的 TextViews 保存字符串。
private ArrayList<String> arraylist = ArrayList<String>();
这将确保一开始你有一个空的数组列表。
在 OnActivityResult 中,您将新收到的字符串添加到数组列表中。
if (requestCode == CHOSEN_FRUIT) {
if (resultCode == RESULT_OK) {
arraylist.add(data.getStringExtra(AvailableItems.FRUIT_ID));
}
}
最后,您使用 onResume 中的字符串来用数据填充您的 TextViews。
if(arraylist.size==1){
TextView1.setText(arraylist[0];
}
if(arraylist.size==2){
TextView2.setText(arraylist[1];
}
.
.
.
即使您的设备旋转了,您的 ArrayList 中的数据也应该保留,并且 TextViews 会被 onResume 中的数据填充。
这不是创建列表的最优雅的方式,因为它不会动态增加大小,但是对于大小的动态增加,您可以实现例如 recyclerview。
推荐阅读
- image-processing - 是否可以在不调整大小的情况下将卷积神经网络应用于图像分类?
- python - 从 excel 表中读取并将确切的字符写入 json 文件
- html - 将 JSON 数据与数组、TypeScript (Ionic 3) 结合
- shell - 与多搜索匹配后的 AWK 打印
- selenium - Selenium Webdriver-如何单击网页中的“登录”按钮
- java - java - 使用 IgniteFuture 进行单元测试
- javascript - 来自 localStorage url 的图像返回 [object ArrayBuffer]
- php - 对日期时间字段运行选择查询时出错
- angularjs - 我需要在单击按钮时调用 AngularJS 中组件的 HTML 中定义的脚本中的函数。我怎样才能做到这一点?
- android - 从服务上下文中使用 fileProvider