Android: How to make Layout clickable when EditText is a child












0















I have a Relative Layout with an EditText and an ImageView inside it.
Under certain circumstances, I would like to make the whole layout clickable and not any of its children.



I added an OnClickListener on the layout. And I tried the following with the children:
1. setEnabled(false)
2. setClickable(false)



This works for the ImageView but even after the above changes, when I click on the area near the EditText, the keyboard comes up and I can see the cursor in the edit text.
Instead of that, I am hoping that all click/touch events go to the layout.



Could some one help?
Thanks










share|improve this question























  • Please, let me know if you could make it work. Cheers.

    – dglozano
    Nov 24 '18 at 13:54











  • yes worked. thanks

    – Sunny
    Nov 26 '18 at 5:13
















0















I have a Relative Layout with an EditText and an ImageView inside it.
Under certain circumstances, I would like to make the whole layout clickable and not any of its children.



I added an OnClickListener on the layout. And I tried the following with the children:
1. setEnabled(false)
2. setClickable(false)



This works for the ImageView but even after the above changes, when I click on the area near the EditText, the keyboard comes up and I can see the cursor in the edit text.
Instead of that, I am hoping that all click/touch events go to the layout.



Could some one help?
Thanks










share|improve this question























  • Please, let me know if you could make it work. Cheers.

    – dglozano
    Nov 24 '18 at 13:54











  • yes worked. thanks

    – Sunny
    Nov 26 '18 at 5:13














0












0








0


1






I have a Relative Layout with an EditText and an ImageView inside it.
Under certain circumstances, I would like to make the whole layout clickable and not any of its children.



I added an OnClickListener on the layout. And I tried the following with the children:
1. setEnabled(false)
2. setClickable(false)



This works for the ImageView but even after the above changes, when I click on the area near the EditText, the keyboard comes up and I can see the cursor in the edit text.
Instead of that, I am hoping that all click/touch events go to the layout.



Could some one help?
Thanks










share|improve this question














I have a Relative Layout with an EditText and an ImageView inside it.
Under certain circumstances, I would like to make the whole layout clickable and not any of its children.



I added an OnClickListener on the layout. And I tried the following with the children:
1. setEnabled(false)
2. setClickable(false)



This works for the ImageView but even after the above changes, when I click on the area near the EditText, the keyboard comes up and I can see the cursor in the edit text.
Instead of that, I am hoping that all click/touch events go to the layout.



Could some one help?
Thanks







android android-layout android-view






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 19 '18 at 23:44









SunnySunny

2,640144575




2,640144575













  • Please, let me know if you could make it work. Cheers.

    – dglozano
    Nov 24 '18 at 13:54











  • yes worked. thanks

    – Sunny
    Nov 26 '18 at 5:13



















  • Please, let me know if you could make it work. Cheers.

    – dglozano
    Nov 24 '18 at 13:54











  • yes worked. thanks

    – Sunny
    Nov 26 '18 at 5:13

















Please, let me know if you could make it work. Cheers.

– dglozano
Nov 24 '18 at 13:54





Please, let me know if you could make it work. Cheers.

– dglozano
Nov 24 '18 at 13:54













yes worked. thanks

– Sunny
Nov 26 '18 at 5:13





yes worked. thanks

– Sunny
Nov 26 '18 at 5:13












1 Answer
1






active

oldest

votes


















1














Yon create a CustomLayout class and override the onInterceptTouchEvent method. If that method returns true, the layout's childrens will not receive the touch event. You can create a member variable and a public setter to change the returning value.



CustomLayout class



public class CustomLayout extends LinearLayout {

//If set to false, the children are clickable. If set to true, they are not.
private boolean mDisableChildrenTouchEvents;

public CustomLayout(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
mDisableChildrenTouchEvents = false;
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return mDisableChildrenTouchEvents;
}

public void setDisableChildrenTouchEvents(boolean flag) {
mDisableChildrenTouchEvents = flag;
}
}


MainActivity



public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

CustomLayout layout = findViewById(R.id.mylayout);

//Disable touch events in Children
layout.setDisableChildrenTouchEvents(true);

layout.setOnClickListener(v -> System.out.println("Layout clicked"));
}
}


XML Layout



<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">


<com.example.dglozano.myapplication.CustomLayout
android:id="@+id/mylayout"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@drawable/outline"
android:clipChildren="true"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">


<EditText
android:id="@+id/editText2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Enter email"
android:inputType="textEmailAddress"
android:layout_gravity="center"/>
</com.example.dglozano.myapplication.CustomLayout>


</android.support.constraint.ConstraintLayout>





share|improve this answer























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53384251%2fandroid-how-to-make-layout-clickable-when-edittext-is-a-child%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    1














    Yon create a CustomLayout class and override the onInterceptTouchEvent method. If that method returns true, the layout's childrens will not receive the touch event. You can create a member variable and a public setter to change the returning value.



    CustomLayout class



    public class CustomLayout extends LinearLayout {

    //If set to false, the children are clickable. If set to true, they are not.
    private boolean mDisableChildrenTouchEvents;

    public CustomLayout(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    mDisableChildrenTouchEvents = false;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
    return mDisableChildrenTouchEvents;
    }

    public void setDisableChildrenTouchEvents(boolean flag) {
    mDisableChildrenTouchEvents = flag;
    }
    }


    MainActivity



    public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    CustomLayout layout = findViewById(R.id.mylayout);

    //Disable touch events in Children
    layout.setDisableChildrenTouchEvents(true);

    layout.setOnClickListener(v -> System.out.println("Layout clicked"));
    }
    }


    XML Layout



    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <com.example.dglozano.myapplication.CustomLayout
    android:id="@+id/mylayout"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:background="@drawable/outline"
    android:clipChildren="true"
    android:orientation="vertical"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent">


    <EditText
    android:id="@+id/editText2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:ems="10"
    android:hint="Enter email"
    android:inputType="textEmailAddress"
    android:layout_gravity="center"/>
    </com.example.dglozano.myapplication.CustomLayout>


    </android.support.constraint.ConstraintLayout>





    share|improve this answer




























      1














      Yon create a CustomLayout class and override the onInterceptTouchEvent method. If that method returns true, the layout's childrens will not receive the touch event. You can create a member variable and a public setter to change the returning value.



      CustomLayout class



      public class CustomLayout extends LinearLayout {

      //If set to false, the children are clickable. If set to true, they are not.
      private boolean mDisableChildrenTouchEvents;

      public CustomLayout(Context context, @Nullable AttributeSet attrs) {
      super(context, attrs);
      mDisableChildrenTouchEvents = false;
      }

      @Override
      public boolean onInterceptTouchEvent(MotionEvent ev) {
      return mDisableChildrenTouchEvents;
      }

      public void setDisableChildrenTouchEvents(boolean flag) {
      mDisableChildrenTouchEvents = flag;
      }
      }


      MainActivity



      public class MainActivity extends AppCompatActivity {

      @Override
      protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      CustomLayout layout = findViewById(R.id.mylayout);

      //Disable touch events in Children
      layout.setDisableChildrenTouchEvents(true);

      layout.setOnClickListener(v -> System.out.println("Layout clicked"));
      }
      }


      XML Layout



      <?xml version="1.0" encoding="utf-8"?>
      <android.support.constraint.ConstraintLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      xmlns:tools="http://schemas.android.com/tools"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      tools:context=".MainActivity">


      <com.example.dglozano.myapplication.CustomLayout
      android:id="@+id/mylayout"
      android:layout_width="0dp"
      android:layout_height="0dp"
      android:background="@drawable/outline"
      android:clipChildren="true"
      android:orientation="vertical"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintLeft_toLeftOf="parent"
      app:layout_constraintRight_toRightOf="parent"
      app:layout_constraintTop_toTopOf="parent">


      <EditText
      android:id="@+id/editText2"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:ems="10"
      android:hint="Enter email"
      android:inputType="textEmailAddress"
      android:layout_gravity="center"/>
      </com.example.dglozano.myapplication.CustomLayout>


      </android.support.constraint.ConstraintLayout>





      share|improve this answer


























        1












        1








        1







        Yon create a CustomLayout class and override the onInterceptTouchEvent method. If that method returns true, the layout's childrens will not receive the touch event. You can create a member variable and a public setter to change the returning value.



        CustomLayout class



        public class CustomLayout extends LinearLayout {

        //If set to false, the children are clickable. If set to true, they are not.
        private boolean mDisableChildrenTouchEvents;

        public CustomLayout(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        mDisableChildrenTouchEvents = false;
        }

        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
        return mDisableChildrenTouchEvents;
        }

        public void setDisableChildrenTouchEvents(boolean flag) {
        mDisableChildrenTouchEvents = flag;
        }
        }


        MainActivity



        public class MainActivity extends AppCompatActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        CustomLayout layout = findViewById(R.id.mylayout);

        //Disable touch events in Children
        layout.setDisableChildrenTouchEvents(true);

        layout.setOnClickListener(v -> System.out.println("Layout clicked"));
        }
        }


        XML Layout



        <?xml version="1.0" encoding="utf-8"?>
        <android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">


        <com.example.dglozano.myapplication.CustomLayout
        android:id="@+id/mylayout"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="@drawable/outline"
        android:clipChildren="true"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent">


        <EditText
        android:id="@+id/editText2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="Enter email"
        android:inputType="textEmailAddress"
        android:layout_gravity="center"/>
        </com.example.dglozano.myapplication.CustomLayout>


        </android.support.constraint.ConstraintLayout>





        share|improve this answer













        Yon create a CustomLayout class and override the onInterceptTouchEvent method. If that method returns true, the layout's childrens will not receive the touch event. You can create a member variable and a public setter to change the returning value.



        CustomLayout class



        public class CustomLayout extends LinearLayout {

        //If set to false, the children are clickable. If set to true, they are not.
        private boolean mDisableChildrenTouchEvents;

        public CustomLayout(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        mDisableChildrenTouchEvents = false;
        }

        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
        return mDisableChildrenTouchEvents;
        }

        public void setDisableChildrenTouchEvents(boolean flag) {
        mDisableChildrenTouchEvents = flag;
        }
        }


        MainActivity



        public class MainActivity extends AppCompatActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        CustomLayout layout = findViewById(R.id.mylayout);

        //Disable touch events in Children
        layout.setDisableChildrenTouchEvents(true);

        layout.setOnClickListener(v -> System.out.println("Layout clicked"));
        }
        }


        XML Layout



        <?xml version="1.0" encoding="utf-8"?>
        <android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">


        <com.example.dglozano.myapplication.CustomLayout
        android:id="@+id/mylayout"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="@drawable/outline"
        android:clipChildren="true"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent">


        <EditText
        android:id="@+id/editText2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="Enter email"
        android:inputType="textEmailAddress"
        android:layout_gravity="center"/>
        </com.example.dglozano.myapplication.CustomLayout>


        </android.support.constraint.ConstraintLayout>






        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 20 '18 at 0:18









        dglozanodglozano

        915120




        915120






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53384251%2fandroid-how-to-make-layout-clickable-when-edittext-is-a-child%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            MongoDB - Not Authorized To Execute Command

            How to fix TextFormField cause rebuild widget in Flutter

            Npm cannot find a required file even through it is in the searched directory