Android 从子视图处理布局

Android 从子视图处理布局,android,android-layout,Android,Android Layout,简而言之 我正在开发一个Android笔记程序。以下是我想做的: 我有一个自定义类扩展视图,当我的程序启动(onCreate)时,我将这个自定义视图(名为View01)添加到我的主布局中。然后,当我双击当前视图(View01)时,我想添加另一个视图(到我的主布局或其他可能的布局)。 我的代码如下:(这是View01的onTouchEvent函数的一部分) 问题是我甚至不能对View01中的drawLayout做任何事情,我是Android开发的新手,所以我在这里感到困惑。是否只有扩展“活动”的类

简而言之

我正在开发一个Android笔记程序。以下是我想做的: 我有一个自定义类扩展视图,当我的程序启动(onCreate)时,我将这个自定义视图(名为View01)添加到我的主布局中。然后,当我双击当前视图(View01)时,我想添加另一个视图(到我的主布局或其他可能的布局)。 我的代码如下:(这是View01的onTouchEvent函数的一部分)


问题是我甚至不能对View01中的drawLayout做任何事情,我是Android开发的新手,所以我在这里感到困惑。是否只有扩展“活动”的类才能处理布局


非常感谢您的关注。

尝试将drawLayout设置为全局变量,并将其设置为onCreate,而不是onTouch。应该能够从onTouch引用它,并且它是全局的


每次触摸你也会看到很多这样的事件。您可能需要检查手指何时竖起,然后添加。。。因此,您不会添加一堆事件,而在某个地方会遇到另一个问题。

最干净的方法是在自定义视图中定义自己的事件类型和事件侦听器接口。当检测到适当的用户手势时,视图可以将事件通知任何已注册的侦听器。然后在活动中实现一个自定义事件侦听器,它可以通过更新容器布局的内容来响应事件。

我认为您要做的是:

比如说我有两个类:
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
,如果不告诉我,我可以举一个例子。

“甚至不能对view01中的绘图布局做任何事情”-您能详细解释一下这部分吗?这是什么?我试过了,但当触发ACTION_DOWN时,应用程序将被强制关闭,我得到以下结果:异常调度输入事件;MessageQueue回调中出现异常:HandlerReceiveCallback。。。我已经更新了我的一些代码来回答这个问题,你能看一看吗?如果你要扩展视图,你至少需要两个构造函数,看看我发布的代码…还有为什么你不做一个switch语句?好的,这是一个好的开始…用你更改的内容更新你的代码,这样我就可以看一看了。对不起,我只是错误地重写了你的代码,这是我所知道的。首先,您将视图放在的根布局是什么?
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;
}