尽管Activity只将Fragment添加一次,但我的Fragment被创建了两次。当我旋转屏幕时会发生这种情况。此外,每次调用Fragment的onCreateView时,它都会丢失所有变量状态。
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) { // Checking for recreation
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new AppPanelFragment())
.commit();
}
}
}
在活动中的onCreate()方法检查是否有null savedInstanceState,仅当为null时才添加Fragment,因此我看不出为什么Fragment应该被创建两次。在该if条件中设置断点告诉我它只被调用一次,因此活动不应多次添加Fragment。然而,每次方向改变时,Fragment的onCreateView()方法仍将被调用。
public class AppPanelFragment extends Fragment {
private TextView appNameText;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// This method called several times
View rootView = inflater.inflate(R.layout.fragment_app_panel, container, false);
// 2nd call on this method, appNameText is null, why?
appNameText = (TextView) rootView.findViewById(R.id.app_name);
appNameText.text = "My new App";
return view;
}
我通过使用setRetainInstance(true)来使变量状态得以保持,但这是真正的解决方案吗?我期望在屏幕方向改变时,不会创建新的碎片。
onSaveInstanceState()
将数据放入该包中,并在onCreate()
中将其取回,如果savedInstanceState
包不为空。 - Kevin Coppock