屏幕方向改变后,dialogFragment显然没有任何调用

时间:2014-02-18 20:29:44

标签: android screen-orientation android-dialogfragment oncreate

这里有部分活动,其中屏幕方向改变:

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

    et = (EditText) findViewById(R.id.editText1);

    et.setOnLongClickListener(new View.OnLongClickListener() 
    {
        @Override
        public boolean onLongClick(View v) 
        {
            Fragment1 dialogFragment = new Fragment1();
            dialogFragment.show(getFragmentManager(), null);
            dialogFragment.setTextDialog(et.getText().toString());
            return true;                
        }
    });        
}

显然,在DialogFragment中出现的对话框应该出现在onLongClick之后的editText上 (我知道当屏幕方向改变时,Activity重新启动,但它不应该像第一次创建那样正常启动?)

我的问题: 当我至少打开一次对话框并关闭它时,在屏幕方向改变后,我再次在屏幕上显示对话框,就好像我长按了editText。

我不清楚为什么会这样。

我还附加了对话框片段的结构:

public Dialog onCreateDialog(Bundle savedInstanceState) 
{
    final Dialog dialog = super.onCreateDialog(savedInstanceState);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    LayoutInflater adbInflater = LayoutInflater.from(getActivity());

    View eulaLayout = adbInflater.inflate(R.layout.dialog_crypt, null);     
    Button btn_OK = (Button) eulaLayout.findViewById(R.id.btnOK);
    dialog.setContentView(eulaLayout);

    final EditText et = (EditText)eulaLayout.findViewById(R.id.editText2);
    et.setText(textDialog);

    if(et.length()>0)
    {
        et.setText(et.getText().toString() +  " ");
    }

    et.setSelection(et.length());

    btn_OK.setOnClickListener(
            new View.OnClickListener() 
            {
                @Override
                public void onClick(View v) 
                {
                    textDialog = et.getText().toString();
                    ((Main)getActivity()).setTextOnEditText(textDialog);
                    dialog.dismiss();
                }
            });
    return dialog;
}

非常感谢您的帮助。

3 个答案:

答案 0 :(得分:8)

尝试使用片段管理器从堆栈中删除对话框,而不是仅仅解除它。

getFragmentManager().beginTransaction().remove(dialogFragment.this).commit();

顺便说一下,您应该使用Fragment本身,而不是仅使用DialogFragment作为对话框。结帐:DialogFragment

另外,不要像这样调用你的活动方法(((Main)getActivity()).setTextOnEditText(textDialog); ,除非你的片段是一个静态的内部类。而是创建一个interface来讨论片段和活动。

答案 1 :(得分:7)

当屏幕改变方向时,它调用onSaveInstanceState方法,并将状态保存在包括堆栈的Bundle对象中。如果在不清除此堆栈的情况下关闭对话框,则在旋转手机时会显示该对话框,因为它位于saveInstanceState包中。

您必须通过以下方式清除堆栈中的对话框:

getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();

如果您对对话框片段使用支持库,或

getActivity().getFragmentManager().beginTransaction().remove(this).commit();

答案 2 :(得分:0)

当发生配置更改(如旋转)时,旧的Fragment不会被销毁 - 它只是在重新创建时将自身添加回Activity(默认情况下android保留片段)。因此,如果您在旋转前显示DialogFragment,它会在旋转后立即显示。