简体   繁体   中英

Linear layout not getting visible OnClickListener

I have two layouts. I want to keep one layout gone when the activity is loaded and it should be visible onClick of another layout. so I have added this code OnClickListener of the layout.

 additionalContactFrom.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            if(linearLayoutFrom.getVisibility() == View.GONE){

                linearLayoutFrom.setVisibility(View.VISIBLE);

            }else{
                linearLayoutFrom.setVisibility(View.GONE);

            }
        }
    });

And have set visibility of the layout gone in xml file..

<LinearLayout
                android:orientation="horizontal"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/LinearLayoutAdditionalContactFrom">

                <ImageView
                    android:layout_width="25dp"
                    android:layout_height="25dp"
                    android:id="@+id/imageView13"
                    android:layout_marginLeft="20dp"
                    android:background="@drawable/ic_person_black_48dp"
                    android:layout_marginTop="05dp"
                    />

                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:id="@+id/editText"
                    android:layout_marginRight="10dp"
                    android:drawableRight="@drawable/ic_expand_more_black_24dp"
                    android:text="Additional contact (optional)"
                    android:cursorVisible="false"
                    />
            </LinearLayout>
                <LinearLayout
                    android:orientation="vertical"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="60dp"
                    android:layout_marginRight="50dp"
                    android:layout_gravity="center"
                    android:visibility="gone"
                    android:id="@+id/LinearLayoutFrom">

                    <EditText
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:id="@+id/editText2"
                        android:layout_weight="1"
                        android:hint="Name"
                        android:layout_gravity="center"
                        />

                    <EditText
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:id="@+id/editText3"
                        android:layout_weight="1"
                        android:hint="Phone"
                        android:layout_gravity="center"
                       />

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textAppearance="?android:attr/textAppearanceSmall"
                        android:text="OR"
                        android:id="@+id/textView19"
                        android:layout_gravity="center" />

            </LinearLayout>

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceSmall"
                android:id="@+id/textView13"
                android:layout_marginLeft="48dp"
                android:hint="Input if you're not receiver" />

        </LinearLayout>

Unable to understand whats going wrong.. The listener is not getting called at all.. Please help..

Change

linearLayoutFrom.setVisibility(View.VISIBLE);

To

findViewById(R.id.YOURLAYOUTID).setVisibility(View.VISIBLE);

I think you can't access to local vars in sub methods

It Seems That Layout Visibility is Already set to GONE, so Onlick listener is not working on hidden View and it should not work too.

INVISBLE means you are trying to add a listener to a view which is not there. You can add the listener to a visible view only.

WORKAROUND

1) Try to make a dummy view which is visible but having the same color as background.

2) Try to set the listener for parent and check the position (whether the position does belongs to INVISIBLE view).

Your problem is that your EditText is capturing the click event when you click on it. If you click somewhere else in the LinearLayout it should work. You can replace the EditText with a TextView if you don't need the user to edit the content.

Please try to set the onClickListener to the EditText and to the ImageView and no to the LinearLayout

The problem is that the Handler of the EditText is most important that the LinearLayout handler.

Almost you can try to make a break point to the OnClick and see what is happend

This is an example to explain you how to do that: in MainActivity Class:

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.Toast;

public class MainActivity extends Activity {

    private LinearLayout linearLayoutFrom;
    private LinearLayout additionalContactFrom;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        additionalContactFrom = (LinearLayout) findViewById(R.id.LinearLayoutAdditionalContactFrom);
        linearLayoutFrom = (LinearLayout) findViewById(R.id.LinearLayoutFrom);

        linearLayoutFrom.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Toast.makeText(getApplicationContext(),
                        "linearLayoutFrom clicked!!!", Toast.LENGTH_SHORT)
                        .show();
                if (additionalContactFrom.getVisibility() == View.GONE) {

                    additionalContactFrom.setVisibility(View.VISIBLE);

                } else {
                    additionalContactFrom.setVisibility(View.GONE);

                }
            }
        });

        additionalContactFrom.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Toast.makeText(getApplicationContext(),
                        "additionalContactFrom clicked!!!", Toast.LENGTH_SHORT)
                        .show();

                if (linearLayoutFrom.getVisibility() == View.GONE) {

                    linearLayoutFrom.setVisibility(View.VISIBLE);

                } else {

                    linearLayoutFrom.setVisibility(View.GONE);

                }
            }
        });
    }

}

in xml file:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/LinearLayoutAdditionalContactFrom"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/holo_blue_dark"
        android:orientation="horizontal" >
    </LinearLayout>

    <LinearLayout
        android:id="@+id/LinearLayoutFrom"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:layout_marginLeft="60dp"
        android:layout_marginRight="50dp"
        android:background="@android:color/holo_green_light"
        android:orientation="vertical"
        android:visibility="gone" >
    </LinearLayout>

    <TextView
        android:id="@+id/textView13"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="48dp"
        android:hint="Input if you&apos;re not receiver"
        android:textAppearance="?android:attr/textAppearanceSmall" />

</FrameLayout>

This is very important that when you want add some view (for example add a linearlayout to another linerlayout). you should use framelayout or relativelayout(do not use linearlayout) for do that.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM