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

3
在 Android 中,我有一个 EditText 和一个与其相邻的 Button,每当我按下其中一个时,我希望另一个也以相同的状态出现。
我尝试在包含布局上放置 android:clickable="true",并在我的 EditText 和 Button 上放置 android:duplicateParentState="true",但是只有当我触摸布局本身时才起作用。如果我触摸我的 EditText 或 Button,什么都不会发生。我尝试在 EditText 和 Button 上设置 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
这与此问题并不完全相关,但在解决类似问题时,android:addStatesFromChildren="true" 对我很有帮助。只是想提醒如果有人遇到类似情况可以尝试一下。 - Kevin
谢谢。我花了很多时间来寻找这个解决方案。你的评论对我非常有用。 - alaster
2个回答

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
        }
    });

我最终用不同的方法解决了这个问题——我使用EditText的drawableRight属性绘制了一个假按钮,并在代码中操纵边界以确保它是正确的大小。 - Kevin

0

我认为你想在RelativeLayout中使用android:focusable="true"而不是clickable。我不确定你所说的“如何使我的视图对触摸事件透明,以便它们传递到父级?”的意思是什么。当你点击EditText时,你希望调用Buttons的onClick()方法吗?


我真正想要的是,如果我点击按钮,我希望底层RelativeLayout处理事件。最终,我用另一种方法解决了这个问题,并创建了一个假按钮,将其设置为EditText的drawableRight,以使它们同时显示为按下状态。 - Kevin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接