我有嵌入片段的主要活动:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
vd = VirtualDatabaseTableProvider.getInstance(getApplicationContext());
fm = getSupportFragmentManager();
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
//Create Layout and add fragments
setContentView(R.layout.main_window);
ListFragment ListFragment= new ListFragment();
android.support.v4.app.FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.fragment_pane, ListFragment, "List");
//ft.replace(R.id.fragment_pane, ListFragment);
ft.addToBackStack(null);
ft.commit();
//Initialising buttons
imgBtnFontInc = (ImageButton) findViewById(R.id.ImgBtnUpFont);
imgBtnFontInc.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(textViewAttached){
try{
//Some text Resize
}
}catch (NullPointerException npe){
Log.e(TAG, "Error on calling Text resize");
Log.e(TAG, npe.getMessage());
Log.e(TAG, npe.getStackTrace().toString());
}
}
}
}
);
/* More Buttons code..... */
imgBtnFontDec.setVisibility(View.GONE);
imgBtnFontInc.setVisibility(View.GONE);
/* Some Saved State handling to recover detailed text Screen*/
if(savedInstanceState != null){
if (savedInstanceState.containsKey("UUID")){
try{
String uuid = savedInstanceState.getString("UUID");
if (uuid != null){
iniTextScreen(uuid);
}
}catch (Exception e){
Log.e(TAG, "Unable To return text");
}
}
}
文本用函数初始化:
private void initTextScreen(String StringID){
Bundle Data = new Bundle();
Data.putString("UUID", StringID);
TextScreenFragment TextFragment = new TextScreenFragment();
TextFragment.setArg1ments(Data);
if(fm == null){
fm = getSupportFragmentManager();
}
android.support.v4.app.FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations( R.anim.animation_enter, R.anim.animation_exit);
ft.replace(R.id.fragment_pane, TextFragment, "TextFragment");
ft.addToBackStack(null);
ft.commit();
}
我通过 TextScreenFragment 的简单回调处理了主要活动中的按钮可见性。主要活动中的回调:
public void onTextViewAttached() {
textViewAttached = true;
MainActivity.this.imgBtnFontDec.setVisibility(View.VISIBLE);
MainActivity.this.imgBtnFontInc.setVisibility(View.VISIBLE);
}
在 TextScreenFragment 中调用的回调:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (!(activity instanceof Callbacks)) {
throw new IllegalStateException(
"Activity must implement fragment's callbacks.");
} else {
listener = (Callbacks) activity;
listener.onTextViewAttached();
}
}
public interface Callbacks {
/**
* Callback for when an item has been selected.
*/
public void onTextViewAttached();
}
它可以工作,但是当我将 android 手机切换为 potrait/landscape 模式时:片段中的 onAttached 在主 Activity 和 Button 对象中的 onCreate 之前被调用。在主要活动中调用 onCreate 之前,如何将片段附加到主要活动上?
在按钮已经初始化之后,我在 onCreate 方法的最后附加了一个特定的片段,但是为什么在我附加片段之前调用片段中的 onAttach 并获得空异常,因为按钮对象没有在 onCreate 中初始化?怎么可能?
当我注释掉:
`// MainActivity.this.imgBtnFontDec.setVisibility(View.VISIBLE);
//MainActivity.this.imgBtnFontInc.setVisibility(View.VISIBLE);`
在回调函数public void onTextViewAttached()
中,没有更多的崩溃,但我仍然注意到 onAttach 在主要活动创建之前被调用并被调用两次:一次来自地狱的未初始化活动知道是(主要活动的每个元素都为空或具有默认值),第二次从主要活动 onCreate 正确附加片段的时间。
我得出的结论是,在方向开关上,片段会附加到未初始化的活动上。我是否遗漏了一些东西,在方向更改时我应该在主活动中的 onCreate 之前调用其他函数以从布局中获取按钮吗?
它是某种我不知道并且可以利用的片段自动附加行为吗?
附加了片段的活动的生命周期是什么,因为在创建主要活动之前在片段中调用 onAttach 似乎违反直觉。