1

私はonDraw()Androidandroid.view.Viewクラスのメソッドをインターセプトして、ビューがそれ自体を描画し終えたとき(そしてその後他の操作を起動したとき)についての手がかりを得ようとしています。

しかし、これは私にいくつかのJavaの質問を導きました(私はJavaの経験が限られています)。

My ActivityonCreate()メソッドには、次のコードが含まれています。

LayoutInflater inflater = (LayoutInflater)   getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
View view = inflater.inflate(R.layout.nessiean, null);
setContentView(view);
doSomeOperations();

サブクラスを定義しました。その主な目的は、内部状態を定義し、wait()メソッドを提供することです。

class MyView extends View{
    int state=0;

    public MyView(Context context){
        super(context);
    }

    public MyView(Context context, AttributeSet attrs){
        super(context,attrs);
    }

    public MyView(Context context, AttributeSet attrs, int defStyle){
        super(context,attrs,defStyle);
    }

    protected void onDraw (Canvas canvas){
        super.onDraw(canvas);
        state=1;
    }

    public void waitforDraw(){
        while(state==0){};
    }
}

質問は次のとおりです。

  1. 上記のように、サブクラス内のすべてのパブリックコンストラクターを再定義する必要がありますか?Javaはデフォルトでそれらを呼び出しませんか?

  2. onCreate()メソッドで次の行を置き換えることはできません。

View view = inflater.inflate(R.layout.nessiean, null);

MyView view = inflater.inflate(R.layout.nessiean, null);

エラーは次のとおりcannot convert from View to MyViewです。

ヒントはありますか?

==========================完全なコードは次のとおりです===================== =========

package com.example;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.os.Bundle;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;

public class SoundActivity extends Activity {

    private Thread mWorkerThread;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //START: ALTERNATIVE WAY FOR CREATING THE VIEW
        //*first variant:
        //setContentView(R.layout.nessiean);
        //*second variant:
        LayoutInflater inflater = (LayoutInflater)   getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
        MyView view = (MyView) inflater.inflate(R.layout.nessiean, null);
        setContentView(view);
        //STOP: ALTERNATIVE WAY FOR CREATING THE VIEW
        System.loadLibrary("soundtest");
        mWorkerThread =  new Thread(new Runnable() {
            public void run() {
                execute();      
            }
        },"Worker Thread");
        try{
            mWorkerThread.start();
            mWorkerThread.join(); 
        }
        catch (Exception e) {
            System.exit(1); 
        }
    }   

    private native void execute();
}

class MyView extends View{
    int state=0;

    public MyView(Context context){
        super(context);
    }

    public MyView(Context context, AttributeSet attrs){
        super(context,attrs);
    }

    public MyView(Context context, AttributeSet attrs, int defStyle){
        super(context,attrs,defStyle);
    }

    @Override
    protected void onDraw (Canvas canvas){
        super.onDraw(canvas);
        state=1;
    }

    public void waitforDraw(){
        while(state==0){};
    }
}
4

3 に答える 3

3

上記のように、サブクラス内のすべてのパブリックコンストラクターを再定義する必要がありますか?

状況によって異なります。これらすべてのコンストラクターが必要ですか?クラスに必要なものだけを宣言してください。

Javaはデフォルトでそれらを呼び出しませんか?

いいえ。コンストラクターを宣言しない場合コンパイラーは次の形式のコンストラクターを作成しようとします。

public ClassName() {
    super();
}

宣言されたコンストラクターの場合、(スーパークラスまたはこのクラスのいずれかで)別のコンストラクターに明示的にチェーンしないと、暗黙的に追加super()されます。つまり、スーパークラスのパラメーターなしコンストラクターの呼び出しです。そのコンストラクターが存在しないか、アクセスできない場合、コンパイル時に失敗します。

onCreate()メソッドで次の行を置き換えることはできません。

View view = inflater.inflate(R.layout.nessiean, null);

MyView view = inflater.inflate(R.layout.nessiean, null);

の呼び出しinflate実際にのインスタンスを返す場合はMyView、キャストを追加するだけです。

MyView view = (MyView) inflater.inflate(R.layout.nessiean, null);

私はそれがうまくいくかどうか確かに言うためにインフレータについて十分に知りません。

于 2012-04-16T13:21:39.433 に答える
1
  1. はい、示されているようにスーパークラスコンストラクターを呼び出したい場合はそうです。それは必要です。
  2. View戻ってきたインフレートをにキャストしてみてくださいMyView
于 2012-04-16T13:22:40.947 に答える
0

nessiean.xmlファイルで、を宣言する代わりに、<View>...</View>単に<に変更する必要がありますMyView>...</MyView>。このようにして、findViewByIdを呼び出すときに実際にMyViewオブジェクトを返します。

また、onCreateメソッドは次のようになります。

setContentView(R.layout.nessiean);
MyView myView = (MyView) findViewById(R.id.<whatever tag you gave the view);
于 2012-04-16T20:54:16.910 に答える