Пакет фрагмента является нулевым в onCreate, несмотря на переопределение onSaveInstanceState - PullRequest
0 голосов
/ 26 июня 2018

My MainActivity использует фрагменты, упрощенная версия макета выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    tools:context=".MainActivity">

    <fragment
        android:name="com.lafave.MyFragment1"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"/>

    <View
        android:layout_width="@dimen/divider_width"
        android:layout_height="match_parent"
        android:background="@android:color/darker_gray" />

    <fragment
        android:name="com.lafave.MyFragment2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

Из фрагмента я использую следующий код для запуска собственного приложения камеры:

mRecentPhotoPath = file.getAbsolutePath();
final Uri uri = Uri.fromFile(file);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);

Метод onActivityResult моего фрагмента зависит от значения сохраняемого mRecentPhotoPath:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
            //mRecentPhotoPath is used here to display the photo.
    }
}

Однако, если я повернул устройство во время работы приложения собственной камеры, то будет создан новый экземпляр моего фрагмента иmRecentPhotoPath не будет сохранен.Я думал, что смогу решить эту проблему, реализовав onSaveInstanceState во фрагменте следующим образом:

@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
    if(mRecentPhotoPath != null) {
        outState.putString(RECENT_PHOTO_PATH_ARUGMENT, mRecentPhotoPath);
    }
}

Однако, хотя я сохраняю состояние в пакете, когда фрагмент восстанавливается, onCreateView, onActivityCreated и onViewStateRestoredу методов всегда есть нуль для их пакета.Что я делаю не так?

На самом деле это кажется проблемой независимо от камеры.Если я поверну свое приложение (не открыв собственную камеру), то в различных методах, таких как onCreateView, наборы всегда будут нулевыми.

1 Ответ

0 голосов
/ 26 июня 2018

Спасибо @EpicPandaForce, вы поставили меня на правильный путь.Проблема заключалась в том, что макет моей MainActivity не использовал идентификатор для фрагмента.Внесение этих изменений устранило мои проблемы:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    tools:context=".MainActivity">

    <fragment
        android:id="@+id/myFragment1"
        android:name="com.lafave.MyFragment1"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"/>

    <View
        android:layout_width="@dimen/divider_width"
        android:layout_height="match_parent"
        android:background="@android:color/darker_gray" />

    <fragment
        android:id="@+id/myFragment2"
        android:name="com.lafave.MyFragment2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>
...