[英]How to use a Fragment to run an AsyncTask that uses ProgressDialog and can survive an Orientation Change
我正在遵循CommonsWare的書中的示例,該示例如何使用Fragment處理異步任務的方向更改(使用setRetainInstance(true))。 然后,我嘗試向異步任務添加進度對話框,但是在方向更改時始終崩潰,提示“視圖未附加到窗口”。
是否有一種模式可以在片段內部的asynctask中使用進度對話框,當方向改變時,該對話框不會丟失進度對話框或崩潰?
即使片段未銷毀,我是否仍需要管理片段中的進度對話框的生命周期? 我假設既然進度對話框是在活動的UI上創建的,也許我必須通過覆蓋片段的onAttach()和onDetach()方法來銷毀/重新創建進度對話框? 但是,我認為如果我使用片段,Android應該負責重新附加活動。
根據設計准則,ProgressDialog似乎已過時。 看起來我們只應該使用微調器或條形圖,而沒有文字。 鑒於此信息,我認為正確的方法是使用微調器作為片段的布局,並將該布局與主活動的布局一起嵌入。 可以從片段中管理顯示/隱藏它的方式,從而處理方向更改。
不幸的是,我仍然遇到以下錯誤。
08-27 17:38:07.647: E/AndroidRuntime(7863): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.app/com.my.app.ui.SmsVerificationActivity}: java.lang.ClassCastException: android.support.v4.app.NoSaveStateFrameLayout cannot be cast to android.widget.Button
08-27 17:38:07.647: E/AndroidRuntime(7863): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
08-27 17:38:07.647: E/AndroidRuntime(7863): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
08-27 17:38:07.647: E/AndroidRuntime(7863): at android.app.ActivityThread.access$600(ActivityThread.java:123)
08-27 17:38:07.647: E/AndroidRuntime(7863): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
08-27 17:38:07.647: E/AndroidRuntime(7863): at android.os.Handler.dispatchMessage(Handler.java:99)
08-27 17:38:07.647: E/AndroidRuntime(7863): at android.os.Looper.loop(Looper.java:137)
08-27 17:38:07.647: E/AndroidRuntime(7863): at android.app.ActivityThread.main(ActivityThread.java:4424)
08-27 17:38:07.647: E/AndroidRuntime(7863): at java.lang.reflect.Method.invokeNative(Native Method)
08-27 17:38:07.647: E/AndroidRuntime(7863): at java.lang.reflect.Method.invoke(Method.java:511)
08-27 17:38:07.647: E/AndroidRuntime(7863): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
08-27 17:38:07.647: E/AndroidRuntime(7863): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
08-27 17:38:07.647: E/AndroidRuntime(7863): at dalvik.system.NativeStart.main(Native Method)
08-27 17:38:07.647: E/AndroidRuntime(7863): Caused by: java.lang.ClassCastException: android.support.v4.app.NoSaveStateFrameLayout cannot be cast to android.widget.Button
08-27 17:38:07.647: E/AndroidRuntime(7863): at com.my.app.ui.SmsVerificationActivity.initResources(SmsVerificationActivity.java:52)
08-27 17:38:07.647: E/AndroidRuntime(7863): at com.my.app.ui.SmsVerificationActivity.onCreate(SmsVerificationActivity.java:29)
08-27 17:38:07.647: E/AndroidRuntime(7863): at android.app.Activity.performCreate(Activity.java:4465)
08-27 17:38:07.647: E/AndroidRuntime(7863): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
08-27 17:38:07.647: E/AndroidRuntime(7863): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
這是我主要活動的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/header"
android:layout_width="fill_parent"
android:layout_height="60dip"
android:background="@drawable/gradient"
android:gravity="center_vertical"
android:paddingLeft="10dip"
android:text="@string/sms_verification_header"
android:textColor="#ffffff"
android:textSize="16dip" />
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/relative_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/header" >
<TextView
android:id="@+id/verification_description_text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/relative_layout"
android:background="#000000"
android:padding="10dip"
android:text="@string/sms_verification_step_one"
android:textColor="#ffffff"
android:textSize="16dip" />
<View
android:id="@+id/divider"
android:layout_width="fill_parent"
android:layout_height="1dip"
android:layout_below="@+id/verification_description_text"
android:background="#808080" />
<EditText
android:id="@+id/phone_number"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/divider"
android:layout_marginBottom="10dp"
android:layout_marginTop="10dp"
android:imeOptions="flagNoExtractUi"
android:inputType="phone" />
</RelativeLayout>
<fragment
android:id="@+id/async_verification_fragment"
android:name="com.my.app.ui.AsyncVerificationFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_below="@+id/phone_number"
android:layout_weight="1" />
<LinearLayout
android:id="@id/connect_footer"
android:layout_width="match_parent"
android:layout_height="50dip"
android:layout_alignParentBottom="true"
android:background="@drawable/gradient"
android:orientation="horizontal" >
<Button
android:id="@+id/verify"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_weight="1"
android:text="@string/yes" />
<Button
android:id="@+id/cancel"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_weight="1"
android:text="@string/cancel" />
</LinearLayout>
</RelativeLayout>
片段布局:
以及主要活動中令人反感的代碼行:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sms_verification_activity);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
initResources();
}
private void initResources() {
TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
final String number = tm.getLine1Number();
mPhoneNumber = (EditText) findViewById(R.id.phone_number);
if (!TextUtils.isEmpty(number)) {
mPhoneNumber.setText(number);
}
final Button verify = (Button) findViewById(R.id.verify);
這是該片段的onCreateView:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_progress_bar, container);
return v;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.