8

这里有活动的一部分,在屏幕方向变化:屏幕方向变化后的dialogFragment显然出现没有任何呼叫

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;     
     } 
    });   
} 

Apparentely似乎将出现在DialogFragment里面的对话应该只是后出现该onLongClick在EDITTEXT (我知道,当屏幕方向更改活动重新启动,但它不应该像创建的第一次正常启动?)

我的问题: 当我打开至少一次对话框,我在之后关闭它e屏幕方向更改我在屏幕上再次显示对话框,就像我长按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; 
} 

感谢这么多的帮助。

+0

所以,你开始的活动,什么也不做,旋转设备,并出现对话框,或者你开始actitity,点击EditText上,旋转设备... ? – nikis

+0

您确定您的活动正在重新启动吗?你是否添加了可能阻止活动重新启动的代码?像清单中的配置更改? –

+0

@nikis不,对不起,如果我在打开对话框之前旋转屏幕,什么都不会发生。 – Gasta87

回答

8

尝试使用,而不是仅仅贬片段经理从栈中删除的对话框。

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

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

而且,永远不要叫你的活性的方法是这样的(((Main)getActivity()).setTextOnEditText(textDialog); 除非你的片段是一个静态内部类相反,创建一个interface片段和活动之间的交谈

+0

谢谢!有用! – GrafOrlov

+1

我可以确认这种方法的工作原理,但在我的情况下,我遇到过这个问题,仅仅是因为我忘了在'onDismiss'方法中包含这一行:'super.onDismiss(dialog);'。也许这会帮助别人。 – Storix

+0

伟大的评论 - 对我来说,Jabbar的答案导致了'java.lang.IllegalStateException:无法执行此操作后onSaveInstanceState' –

0

当配置变化(如旋转)发生旧片段不被破坏 - 它只是增加了自身回当它重新创建活动(Android的默认保留片段)。因此,如果您在旋转前显示DialogFragment,旋转后会立即显示。

+0

不,我没有旋转前显示的dialogFragment。如果屏幕一次被打开和关闭,它会再次出现。 – Gasta87

+0

但是你上面说过,“如果我在打开对话框之前旋转屏幕,什么都不会发生”。错误在哪里? – nikis

+0

有两种情况:1)我没有onLongClick曾经的editText 2)我onLong点击EditText至少一次。在第一种情况下,当屏幕方向改变时,对话框没有出现。在第二种情况下,当通过点击生成dialog.dismiss()的OK按钮已经关闭对话框时,当屏幕方向改变再次出现时,对话框(如果我onLongClick editText) – Gasta87

7

当屏幕改变方向。 ,它调用的onSaveInstanceState方法,并将其保存在Bundle对象包括堆栈的状态。如果关闭该对话框但不清除栈,然后它会显示对话框,当你旋转手机,因为这是在saveInstanceState束。

您必须清除堆栈中的对话框:

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

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

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