0

短くします。

私は Android のメモ作成プログラムを開発しています。これが私がやりたいことです: ビューを拡張するカスタム クラスがあり、プログラムの起動時 (onCreate) に、このカスタム ビュー (View01 という名前) をメイン レイアウトに追加します。次に、現在のビュー (View01) をダブルクリックしたときに、別のビュー (メイン レイアウトまたは他の可能なレイアウト) を追加したいと考えています。私のコードは次のようなものです:(これは View01 の onTouchEvent 関数の一部です)

public class NotePanel extends View {

private long startTime;
private long endTime;
private DrawPanel drawPanel;
private LinearLayout drawLayout;
final private int pressingTime = 600;
private Context applicationContext;

public NotePanel(Context applicationContext) {
    // TODO Auto-generated constructor stub
    super(applicationContext);
    //this.applicationContext = applicationContext;
    startTime=0;
    endTime=0;
    this.setBackgroundColor(Color.BLUE);
}

@Override
public boolean onTouchEvent(MotionEvent event){
    if(event.getActionMasked() == MotionEvent.ACTION_DOWN){
        startTime = System.currentTimeMillis(); 
        System.out.println("click");
    }

    if(event.getActionMasked() == MotionEvent.ACTION_UP){
        endTime = System.currentTimeMillis();
        System.out.println(endTime-startTime);
        if (endTime-startTime >= pressingTime){

            drawPanel = new DrawPanel(this.applicationContext);
            //drawPanel.setVisibility(GONE);

            drawPanel.setBackgroundColor(Color.RED);
            //drawLayout = new LinearLayout(applicationContext);
            drawLayout.addView(drawPanel);

        }
    }

    return true;
}

問題は、View01 の drawLayout に対して何もできないことです。私は Android 開発に慣れていないので、ここで困惑しています。「アクティビティ」を拡張するクラスだけがレイアウトを処理できますか?

ご清聴ありがとうございました。

4

3 に答える 3

1

あなたがやりたいことは次のようなものだと思います:

私は2つのクラスを持っていると言わないでください.View01それは拡張viewし、View02それも拡張しviewます. したがって、ビューをレイアウトに追加するには、次のようにします。

public class NotePanel extends ViewGroup {

private long startTime;
private long endTime;
private DrawPanel drawPanel;
//private LinearLayout drawLayout;
final private int pressingTime = 600;

public NotePanel(Context applicationContext) {
    super(applicationContext);
    startTime=0;
    endTime=0;
    this.setBackgroundColor(Color.BLUE);
    drawPanel = new DrawPanel(applicationContext);
    this.addView(drawPanel);
    //drawLayout = new LinearLayout(applicationContext);
    //drawLayout.addView(drawPanel);
}
public NotePanel(Context applicationContext, AttributeSet attrs){
    super(applicationContext);
    startTime=0;
    endTime=0;
    this.setBackgroundColor(Color.YELLOW);
    drawPanel = new DrawPanel(applicationContext);
    this.addView(drawPanel);
}

@Override 
protected void onLayout(boolean changed, int l, int t, int r,int b){

}

@Override
public boolean onTouchEvent(MotionEvent event){
    if(event.getActionMasked() == MotionEvent.ACTION_DOWN){
        startTime = System.currentTimeMillis(); 
        System.out.println("click");
    }

    if(event.getActionMasked() == MotionEvent.ACTION_UP){
        endTime = System.currentTimeMillis();
        System.out.println(endTime-startTime);
        if (endTime-startTime >= pressingTime){
            drawPanel.setVisibility(VISIBLE);
            drawPanel.setBackgroundColor(Color.GREEN);              
        }
    }

    return true;
}

それが役立つことを願っています。また、追加する方法を知っていると思いますがview01、そうでない場合は教えてください。例を挙げることができます。

于 2012-08-01T22:19:52.087 に答える
0

drawLayout をグローバル変数として設定し、onTouch ではなく onCreate に設定してみてください。グローバルでonTouchから参照できるはずです。

タッチするたびに多くの onTouch イベントも取得します。指が上がっていることを確認してから追加する必要があるかもしれません.

于 2012-08-01T22:11:33.927 に答える
0

これを行う最もクリーンな方法は、カスタム ビューで独自のイベント タイプとイベント リスナー インターフェイスを定義することです。適切なユーザー ジェスチャが検出されると、ビューは登録済みのリスナーにイベントを通知できます。次に、カスタム イベント リスナーをアクティビティに実装すると、コンテナー レイアウトのコンテンツを更新することでイベントに応答できます。

于 2012-08-01T22:12:30.967 に答える