Восстановление вида после изменения ориентации - PullRequest
0 голосов
/ 13 октября 2018

У меня есть Fragment, который содержит EditText и ImageView, которые необходимо сохранить при изменениях конфигурации, поэтому я попытался сохранить текст и растровое изображение с помощью onSaveInstanceState.

Но когда яПоверните устройство проблемы запуска.

текст, который я сохранил, перекрываются с подсказкой EditText, а растровое изображение перекрывается с оригинальным заполнителем ImageView.

Я пытался сделатьвосстановление различными способами (onCreateView, onViewCreated и onViewStateRestored).Но все еще остается та же проблема.

, поэтому вместо onSaveInstanceState я использовал setRetainInstance(true), и проблема остается с текстом, перекрывающим подсказку в EditText.

Так, где я сделалнеправильно?И как это решить.

это EditText:

<EditText
    android:id="@+id/username_editext"
    android:layout_centerVertical="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="@string/enter_ur_name"
    android:inputType="text"
    android:lines="1"
    android:padding="8dp"/>

и это ImageView:

<de.hdodenhof.circleimageview.CircleImageView
    android:id="@+id/profile_image"
    android:layout_above="@id/username_editext"
    android:layout_centerHorizontal="true"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:src="@drawable/profile"
    />

и вот коддля сохранения и восстановления через bundle:

public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
    super.onViewStateRestored(savedInstanceState);

    if(savedInstanceState != null){
        Bitmap map = (Bitmap) savedInstanceState.getParcelable(BITMAP_KEY);
        if(map != null)
            mProfile.setImageBitmap(map);
        String name = savedInstanceState.getString(USERNAME_KEY);
        if(name != null)
            mUsernameEditext.setText(name);
    }
}

@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
    if(isPhotoUploaded) {
        Bitmap map = ((BitmapDrawable)mProfile.getDrawable()).getBitmap();
        outState.putParcelable(BITMAP_KEY, map);
    }

    if(!mUsernameEditext.getText().toString().trim().equals("")){
        outState.putString(USERNAME_KEY , mUsernameEditext.getText().toString());
    }
}

Edit 1: Это полный код макета:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".UsernameFragment">

    <de.hdodenhof.circleimageview.CircleImageView
        android:id="@+id/profile_image"
        android:layout_above="@id/username_text_input_layout"
        android:layout_centerHorizontal="true"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:src="@drawable/profile"
        />

    <android.support.design.widget.TextInputLayout
        android:layout_centerVertical="true"
        android:id="@+id/username_text_input_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/enter_ur_name"
        >
        <EditText
            android:id="@+id/username_editext"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="text"
            android:lines="1"
            android:padding="8dp"/>
    </android.support.design.widget.TextInputLayout>

    <Button
        android:id="@+id/upload_photo_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/upload_photo"
        android:layout_centerHorizontal="true"
        android:layout_below="@id/username_text_input_layout"/>

    <Button
        android:id="@+id/next_btn"
        android:layout_below="@id/upload_photo_btn"
        android:layout_centerHorizontal="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/next"/>

</RelativeLayout>

1 Ответ

0 голосов
/ 17 октября 2018

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

Это код перед построением fragment:

    FragmentManager manager = getSupportFragmentManager();
    if (manager.findFragmentById(R.id.container) == null) {
        usernameFragment = UsernameFragment.newInstance();
        manager.beginTransaction()
                .add(R.id.container , usernameFragment)
                .commit();
    }

И этокод сейчас:

    FragmentManager manager = getSupportFragmentManager();
    if (manager.findFragmentByTag("user_name") == null) {
        usernameFragment = UsernameFragment.newInstance();
        manager.beginTransaction()
                .add(R.id.container , usernameFragment , "user_name")
                .commit();
    }

Я до сих пор не знаю, почему первый код перекрывается в представлениях при повороте.и вернул null, если я вызову getter любого представления во фрагменте

...