片段 - 改变方向
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"生命周期
中发生了什么
我想知道如何知道我的片段(启动画面)在我将方向切换为横向之前已经显示。我猜方向改变后 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"生命周期
中发生了什么