如何防止屏幕旋转时显示对话框

时间:2014-04-07 16:01:21

标签: android android-dialog android-dialogfragment

嘿伙计我正在构建一个通过json从mysql加载数据的应用程序。加载数据时,会显示进度对话框。加载完成后,对话框解除。但是,当我更改屏幕旋转时,它会再次显示,然后再次加载数据。我怎样才能防止这种情况发生?而且我使用的所有警报对话框也是如此。有什么帮助吗?

我的代码:

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub

        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            if(!pDialog.isShowing()){
                pDialog.show();
            }else{
                pDialog.dismiss();
            }
            if(!onAboutPressed().isShowing()){
                onAboutPressed().show();
            }else{
                onAboutPressed().dismiss();
            }
            if(!onAlertMobileData().isShowing()){
                onAlertMobileData().show();
            }else{
                onAlertMobileData().dismiss();
            }
            super.onConfigurationChanged(newConfig);
        }
        if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
            if(!pDialog.isShowing()){
                pDialog.show();
            }else{
                pDialog.dismiss();
            }
            if(!onAboutPressed().isShowing()){
                onAboutPressed().show();
            }else{
                onAboutPressed().dismiss();
            }
            if(!onAlertMobileData().isShowing()){
                onAlertMobileData().show();
            }else{
                onAlertMobileData().dismiss();
            }
            super.onConfigurationChanged(newConfig);
        }
    }

我终于修好了。它只需要在清单中。

android:configChanges="orientation|keyboardHidden|screenSize"

欢迎任何帮助,非常感谢。

2 个答案:

答案 0 :(得分:1)

您有两种方式:

  • 保留配置更改的状态。这意味着您需要将Fragment的当前状态存储在savedInstance Bundle中,并在更改发生后恢复其状态。这意味着您不会再次调用.show()对象上的ProgressDialog,而是保持其状态。这是推荐的方式。

  • 自行处理配置更改。这样可以防止Android在某些配置更改期间重新启动Activity / Fragment,并在配置更改时收到回调,这样您就可以根据需要手动更新活动。 这是气馁的方式,应该用作最后一个资源

来源(非常推荐阅读):http://developer.android.com/guide/topics/resources/runtime-changes.html

答案 1 :(得分:1)

在您的清单中,在活动/片段活动代码中,请添加以下内容,

android:configChanges="orientation"

当方向发生变化时,上面的行将通知您的活动/片段活动。为了让您对其执行某些操作,您需要在活动中覆盖以下方法,

 public void onConfigurationChanged(Configuration newConfig) {

     if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){

    Log.e("On Config Change","LANDSCAPE");
}else{

    Log.e("On Config Change","PORTRAIT");
}

}

希望这有帮助

编辑:

请参阅下面的完整代码,

import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.res.Configuration;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

import com.example.android.customviews.R;

public class TestActivity extends FragmentActivity {

    Dialog mDialog = null;

    @Override
    protected void onCreate(Bundle pSavedInstanceState) {
        super.onCreate(pSavedInstanceState);
        setContentView(R.layout.activity_calendar);

        ((Button) findViewById(R.id.openButton)).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View pV) {
                mDialog = ProgressDialog.show(TestActivity.this, "", "Please Wait...");
                new WasteTime().execute(null, null, null);
            }
        });

    }

    @Override
    public void onConfigurationChanged(Configuration pNewConfig) {
        super.onConfigurationChanged(pNewConfig);

        if (mDialog != null && mDialog.isShowing()) {
            mDialog.dismiss();
        }
        if (pNewConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {

            setContentView(R.layout.activity_camera);
            Log.e("On Config Change", "LANDSCAPE");
        }
    }

    class WasteTime extends AsyncTask<String, String, String> {

        @Override
        protected String doInBackground(String... pParams) {

            final int timeWaster = 10000;
            for (int i = 0; i < timeWaster; i++) {
                Log.e("Wasting Time", i + "milliseconds wasted");
            }

            return null;
        }

    }



}

清单:

<activity
            android:name="com.example.android.activities.TestActivity"
            android:theme="@style/ApplicationTheme_ActionBar"
            android:configChanges="orientation">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

这就是我所做的。我只是忘了正确地解除对话。但休息是有效的。但是,如果您使用的是片段,则可能不适用于活动或片段活动。