片段 - 改变方向

Fragment - change orientation

我想知道如何知道我的片段(启动画面)在我将方向切换为横向之前已经显示。我猜方向改变后 Activity 被破坏了。

主要Activity

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //toolbar ...

       showFragment(new SplashFragment());
    }

    public void showFragment(Fragment fragment) {
        getSupportFragmentManager().beginTransaction().replace(R.id.main_frame_layout, fragment).addToBackStack("").commit();
    }

    @Override
    //Menu item icons
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu, menu);
        return true;
    }

片段(启动画面)

public class SplashFragment 扩展片段 {

public static SplashFragment newInstance() {

    Bundle args = new Bundle();

    SplashFragment fragment = new SplashFragment();
    fragment.setArguments(args);
    return fragment;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_splash, container, false);

    return view;
}

@Override
public void onViewCreated(View view, @Nullable final Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    ButterKnife.bind(this, view);

    ((MainActivity) getActivity()).getSupportActionBar().hide();


    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            ((MainActivity) getActivity()).showFragment(ContactListFragment.newInstance());
        }
    }, 1000);
}

引用我的评论

You could add a boolean into the bundle after your handler has been completed for your SplashFragment. So when the SplashFragment is called, the savedInstanceState can check if it is true, then skip and show ContactListFragment instead. Either that or use SharedPreferences and store the boolean in there and check it from MainActivity and do an if () else {} to showFragment(new SplashFragment.newInstance()) or showFragment(newContactListFragment.newInstance())

共享首选项示例:

MainActivity.java

在onCreate之前showFragment()

 [...] // other activity stuff
 SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
 boolean hasShown = sharedPref.getBoolean("hasShown", false);
 if(hasShown)
 { showFragment(new ContactListFragment()); }
 else
 { showFragment(new SplashFragment()); }

SplashFragment.java

在onViewCreated之前new Handler()

 SharedPreferences sharedPref = ((MainActivity) getActivity()).getPreferences(Context.MODE_PRIVATE);
 SharedPreferences.Editor editor = sharedPref.edit();
 editor.putBoolean("hasShown", true);
 editor.commit();

到你叫的那个点

getSupportFragmentManager().beginTransaction().remove(fragment).commit();

您可以通过调用

FragmentManager 中找到您的片段
getFragmentManager().findFragmentByTag(/* by id or tag */)

您可以快速分辨出的示例是

显示的片段
getFragmentManager().findFragmentByTag(/*Id or TAG*/) != null ? fragment was added to FragmentManager : fragment is not in FragmentManager

如果您调用了 remove() 方法,您将无法知道启动画面是否已显示。您可以尝试创建一个布尔值系统来指示片段是否在 FragmentManager 中。

Android 的方向变化确实会杀死活动和碎片。通过将您的活动和片段状态正确保存在

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState)
    //Save your stuff to bundle
}

并在

恢复它们
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if ( savedInstanceState == null) return;
    //get your stuff from savedInstanceState
    //Example
    boolean[] array = savedInstanceState.getBooleanArray("yourkey");
}

您可以将您的布尔指标示例保存到布尔[]数组,并了解在这个"global"生命周期

中发生了什么