Линейный макет не виден OnClickListener

У меня есть два макета. Я хочу оставить один макет пропущенным при загрузке действия, и он должен быть виден при щелчке другого макета. поэтому я добавил этот код OnClickListener макета.

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

            }
        }
    });

И установили видимость макета в XML-файле.

<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>

Невозможно понять, что происходит не так.. Слушателю не звонят вообще.. Пожалуйста, помогите..

5 ответов

Решение

Ваша проблема в том, что ваш EditText захватывает событие click, когда вы нажимаете на него. Если вы щелкнете где-нибудь еще в LinearLayout, он должен работать. Вы можете заменить EditText на TextView, если вам не нужно, чтобы пользователь редактировал содержимое.

+ Изменить

linearLayoutFrom.setVisibility(View.VISIBLE);

к

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

Я думаю, что вы не можете получить доступ к локальным переменным в под-методах

Пожалуйста, попробуйте установить onClickListener для EditText и ImageView, а не для LinearLayout

Проблема в том, что обработчик EditText является наиболее важным, чем обработчик LinearLayout.

Почти вы можете попытаться сделать точку останова на OnClick и посмотреть, что происходит

Кажется, что видимость макета уже установлена ​​на GONE, поэтому слушатель Onlick не работает со скрытым представлением и не должен работать.

INVISBLE означает, что вы пытаетесь добавить слушателя к представлению, которого там нет. Вы можете добавить слушателя только в видимый вид.

Временное решение

1) Попробуйте создать фиктивный вид, который будет видимым, но будет иметь тот же цвет, что и фон.

2) Попытайтесь установить слушателя для родителя и проверьте позицию (принадлежит ли позиция представлению INVISIBLE).

Это пример, чтобы объяснить вам, как это сделать: в классе MainActivity:

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

                }
            }
        });
    }

}

в файле XML:

<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>

Это очень важно, чтобы, когда вы хотите добавить какое-либо представление (например, добавить линейное расположение в другое линейное расположение). Вы должны использовать framelayout или lativelayout(не используйте linearlayout) для этого.

Другие вопросы по тегам