1

質問で述べたように..

targetFragment を現在の Fragment に設定するとともに、DialogFragment を作成して表示する Fragment があります。

DialogFragment_Progress fragmentProgressBar = new DialogFragment_Progress();        
    fragmentProgressBar.setTargetFragment(this, 0);
    fragmentProgressBar.show(getFragmentManager(), null);   

プログレスバーの更新を行います

// Thread that controls progress bar
final Thread progressThread = new Thread()
{
    @Override
    public void run()
    {           
        active = true;
        int cumulativetime = 0;

        try
        {
            while (active && cumulativetime < TIME_TOTAL)
            {
                sleep(TIME_INTERVAL);

                if (active)
                {
                    cumulativetime += TIME_INTERVAL;

                    updateProgress(cumulativetime);
                }
            }
        }
        catch (InterruptedException e)
        {

        }
        finally
        {
             onContinue();
        }
    }   
};

プログレス バッッドが終了したら、ターゲット Fragment 内のメソッドを呼び出して Toast を表示しようとします。onContinue() コードと targetFragment で呼び出されるメソッドを以下に示します。

// Perform final operations
public void onContinue()
{       
    Fragment_Activate_Program_Specific targetFragment = (Fragment_Activate_Program_Specific) getTargetFragment();

    targetFragment.operationComplete();

    dismiss();
}

操作完了..

// Operation complete
public void operationComplete()
{       
    Toast.makeText(getActivity(), "Herp", Toast.LENGTH_SHORT).show();

    Log.i("Hello: ", "Got here!");
}

Toast しなくても大丈夫な場合は、Log を受信します。この方法は、UI が関与しない以前に何度か機能しました。

問題: targetFragment() で operationComplete() が呼び出されると、次の例外が発生します。

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

関連するスタック トレース..

05-31 12:21:53.024: W/dalvikvm(28494): threadid=13: thread exiting with uncaught exception (group=0x40cc9930)
05-31 12:21:53.034: E/AndroidRuntime(28494): FATAL EXCEPTION: Thread-14251
05-31 12:21:53.034: E/AndroidRuntime(28494): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
05-31 12:21:53.034: E/AndroidRuntime(28494):    at android.os.Handler.<init>(Handler.java:197)
05-31 12:21:53.034: E/AndroidRuntime(28494):    at android.os.Handler.<init>(Handler.java:111)
05-31 12:21:53.034: E/AndroidRuntime(28494):    at android.widget.Toast$TN.<init>(Toast.java:324)
05-31 12:21:53.034: E/AndroidRuntime(28494):    at android.widget.Toast.<init>(Toast.java:91)
05-31 12:21:53.034: E/AndroidRuntime(28494):    at android.widget.Toast.makeText(Toast.java:238)
05-31 12:21:53.034: E/AndroidRuntime(28494):    at com.mypackage.Activity_Activate_Program.activateOperationComplete(Activity_Activate_Program.java:90)

operationComplete() メソッドをホストする呼び出し側フラグメントではなく、親アクティビティを使用しようとしましたが、同じエラーが発生します。

何か案は?

4

2 に答える 2

4

トーストは UI スレッドから呼び出す必要があります。

これを試して。

public void operationComplete()
{       
    getActivity().runOnUiThread(new Runnable() {
        @Override
        public void run() {
            Toast.makeText(getActivity(), "Herp", Toast.LENGTH_SHORT).show();
        }
    });


    Log.i("Hello: ", "Got here!");
}
于 2013-05-31T11:35:13.460 に答える
1

Dialogフラグメントのdismissメソッドをオーバーライドするだけで、これは1つだけを呼び出します。

@Override
Public void dismiss() {
   Log.e(TAG,"dismiss";
   super.dismiss();
 }
于 2013-05-31T11:40:31.327 に答える