Метод findViewById (int) не определен для типа new Runnable () {} - PullRequest
2 голосов
/ 10 ноября 2011

Я работаю над созданием плагина Phonegap для Android. Когда я добавляю 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 Ответ

5 голосов
/ 10 ноября 2011

Вам нужно вызвать findViewById из класса, который на самом деле имеет метод.Хорошей практикой, как правило, является прохождение действия, из которого вы создаете этот класс.Что-то вроде:

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, вы можете заменить внедрение конструктора на установщик:

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

Хотя, чтобы иметь возможность использовать findViewById в вашем Runnable, родительский элемент должен быть конечным, поэтому вам придется скопировать его в конечную переменную (очевидно, внедрение метода set не может быть окончательным)

(NB: Кроме того, ваш класс не использует стандартные соглашения об именах Java, это сбивает с толку: назовите его MsgBox)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...