0

Fragment を使用して非同期タスクの向きの変更を処理する方法に関する CommonsWare の本の例に従っていました (setRetainInstance(true) を使用)。次に、進行状況ダイアログを非同期タスクに追加しようとしましたが、向きを変更すると「ビューがウィンドウに接続されていません」と言ってクラッシュし続けます。

向きが変わったときに進行状況ダイアログが失われたりクラッシュしたりしないフラグメント内にある asynctask 内で進行状況ダイアログを使用するパターンはありますか?

フラグメントが破棄されていない場合でも、フラグメント内の進行状況ダイアログのライフサイクルを管理する必要がありますか? 進行状況ダイアログがアクティビティの UI で作成されるため、フラグメントの onAttach() および onDetach() メソッドをオーバーライドして、進行状況ダイアログを破棄/再作成する必要があると思いますか? ただし、フラグメントを使用する場合は、Android がアクティビティの再アタッチを処理する必要があると考えていました。

4

1 に答える 1

0

設計ガイドラインによると、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;
    }
于 2012-08-27T21:52:26.917 に答える