Android:setReatinInstance(true)不工作

Android:setReatinInstance(true)不工作,android,android-fragments,Android,Android Fragments,我试图在配置更改时保留片段,但即使在使用setRetainInstace(true)之后,也会通过屏幕旋转调用onDestroy() 这是我的片段代码: public class HelloMoonFragment extends Fragment{ private Button mPlay; private Button mStop; private Button mPause; private AudioPlayer mPlayer = new AudioP

我试图在配置更改时保留片段,但即使在使用setRetainInstace(true)之后,也会通过屏幕旋转调用onDestroy()

这是我的片段代码:

public class HelloMoonFragment extends Fragment{

    private Button mPlay;
    private Button mStop;
    private Button mPause;
    private AudioPlayer mPlayer = new AudioPlayer();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setRetainInstance(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_hello_moon, null);

        mPlay = (Button) v.findViewById(R.id.hellomoon_playButton);
        mPlay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mPlayer.play(view.getContext());
            }
        });

        mStop = (Button) v.findViewById(R.id.hellomoon_stopButton);
        mStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mPlayer.stop();
            }
        });

        mPause = (Button) v.findViewById(R.id.hellomoon_pauseButton);
        mPause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try {
                    mPlayer.playpause();
                }catch (IllegalStateException | NullPointerException ex){
                    mPlayer.play(getActivity());
                }
            }
        });

        return v;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        Toast.makeText(getActivity(), "Ikkkkkkkkkkkkkkkkkk", Toast.LENGTH_SHORT);
        Log.i("HEYEE", "NOOO");
        mPlayer.stop();
    }
}
这是我的布局xml文件:

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/helloMoonFragment"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:name="com.github.domain.hellomoon.HelloMoonFragment">

</fragment>

为什么每次旋转都调用onDestroy()?

onDestroy()不会被调用,但在您的示例中,它是:

@Override
    public void onDestroyView() {
        super.onDestroyView();
        Toast.makeText(getActivity(), "Ikkkkkkkkkkkkkkkkkk", Toast.LENGTH_SHORT);
        Log.i("HEYEE", "NOOO");
        mPlayer.stop();
    }
奥德斯特罗=onDestroyView

不会调用onDestroy()(但仍然会调用onDetach(),因为片段正在从其当前活动中分离)


当先前由onCreateView(LayoutInflater、ViewGroup、Bundle)创建的视图已从片段中分离时调用onDestroyView这是设计的<代码>onDestroyView()。但是,将不会调用onDestroy()

这是因为托管片段的
活动
仍可能被销毁并重新创建——因此,
片段
中的任何
视图
引用仍将保留对现在已死亡的
活动
的引用。因此,预期的行为是,在配置更改期间,任何实例状态、正在运行的任务等都可以继续正常运行;但是,您仍有责任释放您的
视图
引用,并在
onCreateView()
中重新创建它们