1

ビューを含むレイアウトを設定するアクティビティからカスタムビュー(「canvasview」)のメソッドを呼び出すことができません。アクティビティからcanvasviewの「ゲッター」を呼び出すことすらできません。

また、ビューをカスタムクラス(Activityを拡張しない)に渡しているので、カスタムクラスからもcanvasviewのメソッドを呼び出すことができません。

何が間違っているのかわかりません...

GameActivity.java:

public class GameActivity extends Activity implements OnClickListener
{

    private View canvasview;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.game_layout);

        canvasview = (View) findViewById(R.id.canvasview);

        // Eclipse displays ERROR con those 2 method calls:
        int w = canvasview.get_canvaswidth();
        int h = canvasview.get_canvasheight();
    (...)

game_layout.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".GameActivity" >

    (...)

    <com.example.test.CanvasView
        android:id="@+id/canvasview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

CanvasView.java:

public class CanvasView extends View
{
    private Context context;
    private View view;
    private int canvaswidth;
    private int canvasheight;

    public CanvasView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        this.context = context;
        this.view = this;
    }


    @Override
    protected void onSizeChanged(int width, int height, 
                                 int old_width, int old_height)
    {
        this.canvaswidth = width;
        this.canvasheight = height;
        super.onSizeChanged(width, height, old_width, old_height);
    }

    public int get_canvaswidth()
    {
        return this.canvaswidth;
    }

    public int get_canvasheight()
    {
        return this.canvasheight;
    }    

私はこれとかなり混乱しています:?

また、コンストラクターでcanvasviewへの参照を受け取り、それを「解決」できない別のクラス( "Activity"を拡張しない)があります:?

ありがとう、質問があまりにも明白であるならば申し訳ありません、私はJavaから始めています、そしてそれらの種類のものは私にかなり混乱しています...

編集:

就寝中(03:00 AM)、考えてみると、Viewオブジェクトには実際にはget_canvaswidth()メソッドがないため、Eclipseがその行をエラーとしてマークしていることに気付きました。子の「CanvasView」メソッドのみがそれを持っています。したがって、私の問題はアップキャストで解決できます:

int w = ((CanvasView) canvasview).get_canvaswidth();

つまり、ビューをパラメーターとして受け取るということですが、実際にはビューの子になっているので、アップキャストを使用して「子の」メソッドを呼び出すことができるはずです。これで、eclipseはエラーを生成しませんが、 wとhは常に0を報告します:-?。また、回答で提案されているようにアップキャストを使用せず、呼び出しでCanvasViewオブジェクトを送受信することもテストしましたが、両方とも0になります:?

4

1 に答える 1

5
private View canvasview;

何が格納されcanvasviewていても、変数タイプで定義されたメソッドのみを呼び出すことができます。この行を変更する必要があります。

private CanvasView canvasview;
于 2013-03-22T23:22:54.617 に答える