我有一个活动,用户可以输入主机名,用户名和密码,然后点击“验证凭据”按钮。然后将检查凭据,这将花费一些时间。在此期间,用户既不能更改凭据也不能再次单击“验证”。因此,像 ProgressDialog 这样的模态对话框似乎是完美的。
不幸的是,ProgressDialog在方向更改等方面存在众所周知的限制。指南(UI/Dialogs)告诉我们完全避免使用ProgressDialog并在布局中使用ProgressBar(如Progress & Activity中所示)。这是什么意思?我只用一个进度条创建另一个活动吗?或者禁用所有输入字段并在其上放置进度条?听起来很奇怪......你最喜欢的解决方案是什么?
答案 0 :(得分:3)
我使用的最好的事情是:
在登录ProgressBar
旁边放置Button
。
我在View.GONE
方法中放置了一个进度条(其可见性设置为OnCreate
)。
当用户点击“登录/提交”按钮时,我将按钮的可见性设置为View.GONE
,并将ProgressBar
的可见性设置为View.VISIBLE
。
它看起来不错,用户无法点击按钮直到工作完成,如果发生错误,切换可见性以让用户再试一次
答案 1 :(得分:1)
与answer中提到的@micro.pravi一样,您可以在布局中实现ProgressBar
。要在更改方向后保持状态,您必须使用onSaveInstanceState
和onRestoreInstanceState
来保存和恢复重要值,即私有变量,例如private boolean isChecking
public class MyActivity extends Activity {
public boolean isProcessing;
@Override
public void onCreate(Bundle stateBundle) {
super.onCreate(stateBundle);
// Set Layout
setContentView(R.layout.main);
if(stateBundle!=null) {
// read your data here from the bundle
isProcessing = stateBundle.getBoolean("isProcessing");
}
setUiState(isChecking);
}
@Override
protected void onRestoreInstanceState(Bundle stateBundle) {
// Second value of getBoolean is the default value
isProcessing = stateBundle.getBoolean("isProcessing", false);
super.onRestoreInstanceState(stateBundle);
}
@Override
protected void onSaveInstanceState(Bundle stateBundle) {
// Save the critical data
stateBundle.putString("isProcessing", isProcessing);
super.onSaveInstanceState(stateBundle);
}
@Override
protected onResume() {
setUiState(isProcessing);
}
private setUiState(boolean processing) {
textView.setEnabled(!processing);
button.setEnabled(!processing);
progressbar.setVisibility(processing?View.VISIBLE:View.GONE);
}
}
这应该用于保存方向更改的任何关键数据,或者当应用程序被杀死并随后由操作系统恢复时。您不必保存TextView
数据,因为defautl View元素已经自行处理。也不要以这种方式存储图像数据。而是将Uri或路径存储到Url并在恢复时加载它
答案 2 :(得分:-1)
要暂时解决您的问题,您可以继续使用Progress Dialog
并将此行放在Login Activity's
文件的Manifest.xml
标记中:
android:configChanges="orientation|keyboardHidden|screenSize"
使用此行代码不会影响Progress Dialog
方向更改。但根据Android Development的文档,这被认为是错误的做法。
从长远来看,我建议您保留状态以进行方向更改。