我有一個活動,開始執行一個AsyncTask響應點擊一個按鈕小部件。當它使用setEnabled(false)點擊時,我禁用按鈕。 AsyncTask在Activity完成時調用一個回調方法。我在回調中的Button上調用setEnabled(true)以在AsyncTask完成時重新啓用按鈕。這一切都正常工作,直到AsyncTask執行時方向改變。我已經嘗試了很多不同的事情,以便在發生這種情況時正確啓用/禁用Button,並且我無法使其正常工作。即使在AsyncTask正在執行時方向發生變化,使這項工作正確的方法是什麼?方向更改打破禁用按鈕,而AsyncTask執行
0
A
回答
0
我不相信你不需要開始攔截方向的改變。它的切角和它可能會導致你很多頭痛,如果你真的想要做不同的方向加載不同的資源。
根本問題是,AsyncTask對其要更新的按鈕的引用是陳舊的,它指的是舊按鈕。你可以做什麼來解決這個問題是Activity.onRetainNonConfigurationInstanceState()
。在方向更改發生的情況下調用此方法,並允許您存儲非特定配置的項目,如運行線程。
你需要的另一件事是你的AsyncTask中的一個方法來設置它應該啓用/禁用的按鈕。當您的活動重新啓動時,您取消設置按鈕,然後在onCreate()中重置它。
實現可能看起來像這樣。
public class MyActivity extends Activity {
private static final String NON_CONFIG_KEY = "com.example.NON_CONFIG_KEY";
protected void onCreate(Bundle instanceState) {
setContentView(R.layout.main);
HashMap<String, Object> nonConfigState = (HashMap<String, Object>)
getLastNonConfigurationIntstanceState();
if (nonConfigState != null && nonConfigState.get(NON_CONFIG_KEY) != null) {
MyAsyncTask task = (MyAsyncTask) nonConfigState.get(NON_CONFIG_KEY);
task.setUiControl(findViewById(R.id.my_button));
}
}
public Object onRetainNonConfigurationInstanceState() {
task.setUiControl(null);
// create HashMap, store AsyncTask in it, and return it
}
}
public MyAsyncTask extends AsyncTask {
private Button mControl = null;
private boolean shouldUpdateControl = false;
private Object mLock = new Object();
public void setUiControl(Button b) {
synchronized (mLock) {
if (b != null && shouldUpdateControl) {
b.setEnabled(true);
shouldUpdateControl = false;
}
mControl = b;
}
}
protected void onPostExecute(Result r) {
synchronized (mLock) {
if (mControl == null) {
shouldUpdateControl = true;
} else {
mControl.setEnabled(true);
}
}
}
}
1
當您的應用程序onCreate方法中的方向chaneg被再次調用並且您已經寫入了onCreate方法中的所有邏輯時。這樣會讓你的應用程序不來的onCreate()方法時,方向改變
添加以下活動申報清單:
android:configChanges="orientation"
所以它看起來像
<activity android:label="@string/app_name"
android:configChanges="orientation|keyboardHidden"
android:name=".your.package">
相關問題
- 1. UIActivityViewController的「更多」按鈕打破方向設置
- 2. 禁用方向更改 - WindowManager
- 3. 如何打破這樣做,而按鈕
- 4. JavaScript重定向,打破回按鈕
- 5. 更改按鈕上文本的方向
- 6. 在AsyncTask期間禁用按鈕
- 7. 更改執行按鈕的位置VB.NET
- 8. 更改按鈕文本執行
- 9. 我想將按鈕更改爲禁用
- 10. 禁用單選按鈕更改
- 11. WPF按鈕更改Rectangle.OpacityMask禁用時
- 12. 禁用,更改值,重置按鈕
- 13. 使用Phonegap禁用方向更改
- 14. 禁用按鈕而DomainContext IsLoading
- 15. 更改TStrings.Delimiter打破按名稱
- 16. 單擊按鈕:禁用並執行按鈕的處理程序
- 17. AJAX - 像按鈕重定向我,而不是執行Ajax調用
- 18. 更改佈局如果方向更改,按鈕錯誤
- 19. 以編程方式使用按鈕更改屏幕方向
- 20. 更改iOS中按鈕和禁用按鈕的文本
- 21. AsyncTask未按預期執行
- 22. 檢測旋轉(方向更改)破壞
- 23. WPF更改按鈕樣式禁用時更改光標?
- 24. Android,AsyncTask,長時間運行的進程和方向更改
- 25. 從通知操作按鈕執行ASyncTask按?
- 26. 在按下的向上按鈕上執行什麼方法
- 27. Python:Tkinter:打破按鈕命令調用
- 28. 行動方法沒有被執行,而點擊按鈕
- 29. 更改或禁用iPhone旋轉動畫時的方向更改
- 30. MVC按鈕單擊執行操作而不重定向