[英]Android - DialogFragment is shown from a Fragment. How to show Toast from Fragment when DialogFragment is dismissed?
正如问题中提到的。
我有一个片段,可以从中创建并显示一个DialogFragment,并将targetFragment设置为当前的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)
我尝试使用父Activity而不是调用片段来承载operationComplete()方法,但出现相同的错误。
有任何想法吗?
应该从UI线程调用Toast。
尝试这个。
public void operationComplete()
{
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getActivity(), "Herp", Toast.LENGTH_SHORT).show();
}
});
Log.i("Hello: ", "Got here!");
}
您可以简单地覆盖Dialog片段的dismiss方法,这只会调用一个。
@Override
Public void dismiss() {
Log.e(TAG,"dismiss";
super.dismiss();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.