私はAndroidのカスタマイズされたダイアログボックスに1つの問題があります、私はAndroidのjavainterfaceを使用してカスタマイズされたダイアログを作成しました、私のクラスCustomizeDialogで私は1つのスレッドにバックグラウンドでいくつかのプロセスを実行させますその後私はこのカスタマイズされたダイアログに1つの画像を設定しましたOnPostExecuteの画像ですが、次のエラーが発生しました
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
別のスレッドからメインUIにアクセスできないことはわかっていますが、OnPostExecutedのメインUIにアクセスしますが、これも機能しません。別のクラス(main.class)では、このクラスを次のように呼び出します。
CustomizeDialog customizeDialog = new CustomizeDialog(mContext);
customizeDialog.show();
これはダイアログボックスを作成する私のコードです
public class CustomizeDialog extends Dialog implements OnClickListener {
Button okButton;
ImageView img = null;
ImageView img2=null;
ImageView img3 = null;
ImageView img4= null;
Bitmap bm;
public CustomizeDialog(Context context) {
super(context);
img2 = (ImageView) findViewById(R.id.imageView1);
img3 = (ImageView) findViewById(R.id.imageView3);
img4 = (ImageView) findViewById(R.id.imageView4);
WindowManager.LayoutParams params = getWindow().getAttributes();
params.x = 30;
params.height = 500;
params.width = 500;
params.y = 50;
this.getWindow().setAttributes(params);
setContentView(R.layout.test);
img = (ImageView) findViewById(R.id.imageView2);
img.setBackgroundResource(R.drawable.sample);
AnimationDrawable frameAnimation = (AnimationDrawable) img.getBackground();
//Start the animation (looped playback by default).
frameAnimation.start();
new LongOperation1(context).execute("");
}
else
{
Toast toast = Toast.makeText(getContext(), "Erorr",
Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.show();
} }
private class LongOperation1 extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... params) {
//here i do some process
return "Executed";
}
@Override
protected void onPostExecute(String result) {
// here i do some process to get bm
img2.setImageBitmap(bm);
}
@Override
protected void onPreExecute() {
}
@Override
protected void onProgressUpdate(String... values) {
}
}
AndroidHTMLActivityクラス
package com.example.hellogap;
import com.example.javainterface.R;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.os.Bundle;
import android.view.Gravity;
import android.webkit.WebView;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
public class AndroidHTMLActivity extends Activity {
WebView myBrowser;
private static final int TEXT_ID = 0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
myBrowser = (WebView)findViewById(R.id.mybrowser);
myBrowser.addJavascriptInterface(new MyJavaScriptInterface(this), "AndroidFunction");
myBrowser.getSettings().setJavaScriptEnabled(true);
myBrowser.loadUrl("file:///android_asset/mypage.html");
}
public class MyJavaScriptInterface {
Context mContext;
MyJavaScriptInterface(Context c) {
mContext = c;
}
public void showToast(String toast){
Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
}
public void openAndroidDialog(){
//CustomizeDialog.this.img2.setImageBitmap(bm);
CustomizeDialog customizeDialog = new CustomizeDialog(AndroidHTMLActivity.this);
customizeDialog.show();
}
}
}
test.xml
<AbsoluteLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/widget0"
android:layout_width="500dp"
android:layout_height="520dp"
android:background="@drawable/bg"
android:clickable="false" >
<ImageView
android:id="@+id/imageView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="193dp"
android:layout_y="315dp"
android:src="@drawable/fb" />
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="51dp"
android:layout_y="318dp"
android:src="@drawable/fa" />
<ImageView
android:id="@+id/imageView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="335dp"
android:layout_y="316dp"
android:src="@drawable/fc" />
<ImageView
android:id="@+id/imageView2"
android:layout_width="200dp"
android:layout_height="204dp"
android:layout_x="298dp"
android:layout_y="91dp" />
</AbsoluteLayout>
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<WebView
android:id="@+id/mybrowser"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</LinearLayout>
mypage.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width; user-scalable=0;" />
<title>My HTML</title>
</head>
<body>
<h1>MyHTML</h1>
<input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" />
<script type="text/javascript">
function showAndroidToast(toast) {
AndroidFunction.showToast(toast);
}
</script>
<input type="button" value="Open Dialog" onClick="openAndroidDialog()" />
<script type="text/javascript">
function openAndroidDialog() {
AndroidFunction.openAndroidDialog();
}
</script>
</body>
</html>
これを行う方法について何か考えがありますか