如何同步两个视图的可绘制状态

时间:2011-03-17 20:13:09

标签: android android-layout

在Android中,我在EditText旁边有一个EditText和一个Button,每当我按下一个时,我希望另一个也出现在同一状态。

我尝试在封闭布局上放置android:clickable =“true”,并在我的EditText和Button上安装android:duplicateParentState =“true”但这只有在触摸布局本身时才有效。如果我触摸我的EditText或按钮没有任何反应。我试着在EditText&上设置android:clickable =“false”。按钮但触摸事件仍然不会过滤到父级。

如何让我的观点对触摸事件透明,以便传递给父母?我想要的是EditText和Button一起工作,所以如果我触摸它们,它们都会被按下。

以下是我目前使用的XML:

<RelativeLayout
    android:id = "@+id/EnclosingLayout"
    android:layout_width = "fill_parent"
    android:layout_height = "120dp"
    android:clickable = "true">
    <EditText
        android:id = "@+id/MyEditText"                                                      
        android:layout_width = "fill_parent"
        android:layout_height = "wrap_content"
        android:layout_weight = "1"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:clickable="false"
        android:duplicateParentState="true"/>
    <Button
        android:id = "@+id/MyButton"
        android:layout_alignTop="@id/MyEditText"
        android:layout_alignBottom="@id/MyEditText"
        android:layout_alignParentRight="true"
        android:duplicateParentState="true"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:layout_width="31.33dp"
        android:gravity="center"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:clickable="false"/>
</RelativeLayout>

2 个答案:

答案 0 :(得分:0)

我认为你想在RelativeLayout中使用android:focusable="true"而不是可点击。我不确定你的意思是“我怎样才能让我的观点对触摸事件透明,以便传递给父母?”当您单击EditText时,您希望调用按钮onClick()吗?

答案 1 :(得分:0)

考虑将所有输入捕获到编辑文本和按钮,并将事件重定向到公共视图控制器,在本例中为常用方法。然后更新常用方法(视图控制器)中的编辑文本和按钮。对于编辑文本,您需要通过为两个事件创建处理程序来捕获触摸和单击,如下所示:

// EDIT TEXT ON TOUCH HANDLER
editTextPassword.setOnTouchListener(new View.OnTouchListener() {    
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub  
            switch (event.getAction()){
                case MotionEvent.ACTION_DOWN:
                    SynchViews();  // view controller
                    break;
            }           
            return true;
        }
    });

// EDIT TEXT ON Click HANDLER (No touch screen)
editTextPassword.setOnClickListener(new OnClickListener() { 
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub  
                        SynchViews();   // view controller
        }
    });