方法findViewById(int)未定义类型new Runnable(){}

时间:2011-11-10 16:04:23

标签: java android cordova

我正在为Android制作一个Phonegap插件。当我将findViewById方法添加到this.ctx.runOnUiThread(new Runnable()时,我收到标题中所述的错误。

这是我的代码:

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);
    }

}

1 个答案:

答案 0 :(得分:5)

您需要从实际拥有该方法的类中调用findViewById。好的做法通常是传递你正在创建这个类的Activity。类似的东西:

public class msgbox extends Plugin {
    private static final String SHOW = "show";
    private static final int MSG_INDEX = 0;
    private String msg;
    private final Activity parent;

    // constructor
    public msgbox(Activity parent) {
        this.parent = parent;
    }

然后你可以做:

parent.findViewById(R.id.layoutroot)

您可以使用以下命令在活动中构建msgbox:

msgbox myMsgBox = new msgbox(this);

当然,要做到这一点,R.id.layoutroot组件必须在您传递的活动中。

如果在构造msgbox时不在活动中,可以使用setter替换构造函数注入:

public void setParent(Activity parent) {
    this.parent = parent;
}

虽然,为了能够在Runnable中使用findViewById,父级需要是最终的,所以你必须将它复制到最终变量(setter注入不能是最终的,显然)

(注意:此外,您的类不使用标准的Java命名约定,令人困惑:称之为MsgBox