首页 > 解决方案 > 如何在父布局上丢失数据的情况下从子布局移动到父布局?以及如何优化我的代码?

问题描述

我是android开发的新手。以下是我的名为“我的水果列表”的 Android 应用程序的代码,其中 Main Activity 在“文本视图”中显示选择的水果,这些水果在“滚动视图”内的“线性布局(垂直方向)”中排列,使用从第二个布局中选择当前主布局底部的“添加水果”按钮。该程序按预期运行,但我有两个问题:

  1. 我的第一个问题是,因为我已将 Main Activity 作为第二个布局的父 Activity,该布局作为子 Activity 工作。但是,当我使用左上角的左箭头从子级移动到父级时,主活动文本视图中的所有数据都消失了。我已经覆盖了 onSaveInstance 和 onRestoreInstance 以在屏幕旋转时保留主要活动的数据,但是当我使用左上角的箭头从子级移动到父级时,它会消失那些“文本视图”中存在的所有数据。为什么?

  2. 我的第二个问题是,我怎样才能优化我的代码意味着让它更短更清晰?

非常感谢!

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>

标签: androidandroid-layout

解决方案


不需要 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。


推荐阅读