【问题标题】:After screen orientation change the dialogFragment appears apparently without any call屏幕方向更改后,dialogFragment 显然出现,没有任何调用
【发布时间】:2014-07-22 14:29:20
【问题描述】:

这里有一部分 Activity 会改变屏幕方向:

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 中的对话框似乎应该出现在 editText 上的 onLongClick 之后 (我知道当屏幕方向改变时,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;
}

非常感谢您的帮助。

【问题讨论】:

  • 所以你开始活动,什么都不做,旋转设备并出现对话框,或者你开始活动,点击edittext,旋转设备......?
  • 您确定您的活动正在轮换中重新开始吗?您是否添加了任何可能阻止活动重新启动的代码?像清单中的配置更改?
  • @nikis 不,对不起,如果我在打开对话框之前旋转屏幕,什么都不会发生。
  • @Injhb 我认为已重新启动,但我也尝试将 android:configChanges="orientation" 放入清单但结果相同!
  • @Gasta87 如果您放置 configChanges 并覆盖该方法,那么活动将不会重新启动。这就是我的观点

标签: android screen-orientation android-dialogfragment oncreate


【解决方案1】:

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

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

顺便说一句,您应该使用DialogFragment 本身,而不是只使用Fragment 进行对话。结帐:DialogFragment

另外,永远不要像这样调用你的活动方法(((Main)getActivity()).setTextOnEditText(textDialog); ,除非你的片段是一个静态内部类。相反,创建一个interface 来在片段和活动之间进行对话。

【讨论】:

  • 我可以确认此方法有效,但在我的情况下,我遇到此问题仅仅是因为我忘记在onDismiss 方法中包含这一行:super.onDismiss(dialog);。也许这会对某人有所帮助。
  • 很棒的评论——对我来说,Jabbar 的回答是java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
  • @ban-geoengineering 这与我的回答无关。当活动未处于恢复状态时,您可能正在调用commit。如果您在onActivityResult 期间调用它,请不要在那里调用,而是确保仅在活动恢复后调用它
【解决方案2】:

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

您必须使用以下命令从堆栈中清除对话框:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 不,我没有在旋转之前显示的 dialogFragment。如果它已经打开和关闭一次,它会在屏幕旋转时再次出现。
    • 但是你在上面说过,“如果我在打开对话框之前旋转屏幕,什么都不会发生”。哪里错了?
    • 有两种情况: 1) 我从来没有 onLongClick editText 2) 我至少 onLongClick editText 一次。在第一种情况下,当屏幕方向更改时,对话框不会出现。在第二种情况下,当对话框已经通过单击产生 dialog.dismiss() 的 OK 按钮关闭时,当屏幕方向发生变化时,对话框再次神奇地出现(就像我 onLongClick editText)
    猜你喜欢
    • 2021-11-21
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 2019-06-02
    相关资源
    最近更新 更多