2

我有嵌入片段的主要活动:

    @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 似乎违反直觉。

4

0 回答 0