EditText 与其在 Android Studio 中的 ID 的关系?

Relation of EditText with its Id in Android Studio?

请仔细阅读我的问题

我正在学习ActivityLifeCycle。我的 XML 布局中只有一个 EditText 和一个 TextView 某些 id。当我旋转屏幕时,似乎没有任何变化,因为旋转不影响 EditText。但是当我删除 XMLEditTextid 并旋转屏幕时,旋转开始影响并且 editText 中的文本由于旋转而被删除。我对 EditText 与其 Id 的关系感到困惑。

我试着在下面的专栏中解释问题:

下面列名的解释

.

Having Id----------------Rotation----------------EditText

Yes                  Rotated            Does not change

No                   Rotated             Yes, Text Removed from editText

MainActivity.java 为空,main_activity.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">

        <EditText

            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ems="10"
            android:hint="Enter here"
            android:inputType="textPersonName"
            android:textSize="26sp"
            android:textStyle="bold"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"

            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.371" />

        <TextView
            android:id="@+id/textView2"
            android:layout_width="85dp"
            android:layout_height="25dp"
            android:layout_marginTop="88dp"
            android:text="TextView"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.496"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>

对不起,我用了糟糕的英语和High-resolution图片,因为我没有其他办法。最好的问候

当您在 android 上旋转屏幕时,应用程序中的所有 Activity 和片段都会被销毁,然后重新创建。 Android 这样做是为了让您的应用程序可以根据新配置重新加载资源。

当系统销毁 activity 时(例如,当屏幕旋转时),虽然实际的 Activity 实例消失了,但系统会记住它的存在。系统使用一组保存的数据创建 activity 的新实例,这些数据描述了 activity 被销毁时的状态。

当您为视图分配一个 ID 时,似乎 android 会跟踪该视图。因此它会记住它的状态。

好的,当您旋转设备时,这被视为配置更改,因此系统会重新创建 activity 并且数据会丢失。

避免这种情况的一种方法是转到清单并针对您的特定 activity 添加此

android:configChanges="orientation|screenSize"

此处:

<activity
android:name=".YourActivityName"
android:configChanges="orientation|screenSize"
....
...

这使得系统忽略设备的旋转。

EditText是一个焦点视图,所以在PhoneWindow中,它的状态会自动保存在saveHierarchyState()方法中。只有具有 id 的 EditText 才能保存文本。

在您应用的清单中,将此行添加到 activity 标签:

android:configChanges="keyboardHidden|orientation|screenSize"

这是因为 Android 每次旋转设备时基本上都会破坏 activity 并重新创建它。这主要是为了允许基于 portrait/landscape 模式的不同布局。

当您为您的组件使用 id 时,数据将被分配给它的 id,但当它没有 id 时,它将被重新创建并且数据将消失旋转后

看到这些问题并阅读他们的好答案,我不复制粘贴它们:

1- TextView's text disappearing when device rotated

2- Handle screen rotation without losing data - Android

Android 编程中最重要的方面之一是处理配置更改,其中最常见的是方向更改。虽然不建议自己处理配置更改,但由于处理配置更改隐藏的复杂性,有些情况下我们可能需要手动处理。

如果您需要保存状态,常见的方法是实现 onSaveInstanceState 来存储和恢复作为 Bundle 传递的值。

回到你的问题:

Relation of EditText with its Id in Android Studio?

在保存 View Android OS 的状态时,只要您调用,就会自动对视图层次结构中的每个视图调用 View.onSaveInstanceState 方法一直到 onSaveInstanceState 中的超级方法。为了恢复数据,当您不为 EditText 提供 id 时,它会针对特定视图的 state.So 使用 android:id 属性键,视图的由于缺少密钥,状态将不会被存储。

希望这能澄清 idEditText

的关系

好的,一个特定的 EditText 项目与其 id 的关系是:"one to one" 或 "one to N"。一个 layout.xml 中的一个 EditText 项目有一个 id,如果你在 layout.xml 中配置了它。如果您定义了多个 layout.xml 并且在多个 layout.xml 中定义了完全相同的 EditText 项(具有相同的 ID),则 EditText 具有 "one to N" 关系。