I’m working on making a Phonegap plugin for Android. When I add the findViewById method to this.ctx.runOnUiThread(new Runnable() I get an error as stated in the title.
Here is my code:
package com.company.msgbox;
import java.io.File;
import org.crossplatform.phonegap.trial.alternativeTo.R;
import org.json.JSONArray;
import org.json.JSONException;
import android.app.AlertDialog;
import android.graphics.Bitmap;
import android.view.View;
import com.phonegap.api.Plugin;
import com.phonegap.api.PluginResult;
import com.phonegap.api.PluginResult.Status;
public class msgbox extends Plugin {
private static final String SHOW = "show";
private static final int MSG_INDEX = 0;
private String msg;
@Override
public PluginResult execute(String arg0, final JSONArray arg1, String arg2) {
if ( arg0.equals(SHOW) ) {
this.ctx.runOnUiThread(new Runnable() {
public void run() {
// try/catch generated by editor
try {
msg = arg1.getString(MSG_INDEX);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
AlertDialog alertDialog = new AlertDialog.Builder(ctx).create();
alertDialog.setTitle("Title");
alertDialog.setMessage(msg);
alertDialog.show();
View content = findViewById(R.id.layoutroot);
Bitmap bitmap = content.getDrawingCache();
File file = new File("/sdcard/test.png");
}
});
}
return new PluginResult(Status.OK);
}
}
You need to call findViewById from a class that actually has the method. The good practice is usually to pass around the Activity you’re creating this class from. Something like:
Then you can do a:
You construct your msgbox from within an activity by using:
Of course, to do that, the
R.id.layoutrootcomponent must be in the activity you passed.If you’re not in an activity when you construct the msgbox, you can replace the constructor injection with a setter:
Although, to be able to use findViewById within your
Runnable, parent needs to be final, so you’ll have to copy it to a final variable (setter injection cannot be final, obviously)(NB: Also, your class doesn’t use standard java naming conventions, it’s confusing: call it
MsgBox)