嘿伙计我正在构建一个通过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"
欢迎任何帮助,非常感谢。
答案 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>
这就是我所做的。我只是忘了正确地解除对话。但休息是有效的。但是,如果您使用的是片段,则可能不适用于活动或片段活动。