Неожиданное поведение при нажатии кнопки, содержащейся в пользовательском LinearLayout - PullRequest
2 голосов
/ 06 апреля 2011

У меня проблема с пользовательским LinearLayout, который я создаю для приложения.По сути, LinearLayout содержит элементы, каждый элемент является горизонтальным LinearLayout, который содержит TextView и Button.LinearLayout заполняется правильно, однако, когда я нажимаю кнопку (фон которой имеет пользовательский фон: селектор), происходит непредвиденное поведение.То, что происходит, - то, что кнопка изменяется, появляется только на последнем элементе LinearLayout, который не имеет никакого смысла.

Код, который заполняет LinearLayout, выглядит следующим образом:

View template = null;

    if (items.size() > 0) {

        for (int i = 0; i < items.size(); i++) {

            template = inflate(getContext(), R.layout.views_custom_list_item, null);
            template.setBackgroundDrawable(getProperBackgroundDrawable(i, items.size() - 1));

            TextView text = (TextView)template.findViewById(R.id.custom_list_text);
            text.setText(items.get(i));

            Button button = (Button)template.findViewById(R.id.custom_list_button);
            button.setId(i);
            button.setBackgroundDrawable(backgroundButton);

            button.setOnClickListener(callListener);

            addView(template);
            template = null;
        }

    }

Я надуваю XML, который содержит макет для каждого элемента, а затем я соответствующим образом устанавливаю свойства.Весь этот код содержится в пользовательском классе, который наследуется от LinearLayout.Вы знаете, где проблема?спасибо

Это мое мнение,

enter image description here

И не важно, какой предмет я нажимаю, я получаю это,

enter image description here

Это элемент XML:

`

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:id="@+id/custom_list_text"
    android:textSize="15sp" 
    android:textColor="@color/black" 
    android:paddingLeft="5dip" android:paddingRight="5dip" 
    android:layout_weight="1" 
    android:gravity="left" />

<ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" 
    android:id="@+id/custom_list_button"/>

`

XML на основном макете:

<com.example.views.CustomLayoutView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/custom_phone_directory" android:layout_margin="5dip" xx:background_single="@drawable/button_complete" xx:background_top="@drawable/button_top" xx:background_middle="@drawable/button_middle" xx:background_bottom="@drawable/button_bottom" xx:button_background="@drawable/button_phone_selector" /> </LinearLayout>

Ответы [ 3 ]

1 голос
/ 06 апреля 2011

Ответ был таков: я не могу повторно использовать рисованный объект в списке. Мне нужно создать drawable для каждой кнопки, которая решает проблему. Спасибо raukodraug за его поддержку и всем, кто указывает мне на некоторые вопросы.

0 голосов
/ 06 апреля 2011

Я не знаю, является ли это ошибкой или особенностью, но подобное поведение может быть достигнуто с помощью следующего кода:

    Drawable d = getResources().getDrawable(R.drawable.bg);
    Button button1 = (Button) findViewById(R.id.button1);
    Button button2 = (Button) findViewById(R.id.button2);
    button1.setBackgroundDrawable(d);
    button2.setBackgroundDrawable(d);        

Здесь кнопка 2 отображается как «нажатая», несмотря на нажатие кнопки 1, и кажется, чтоОтносится к факту, один и тот же объект рисования назначается в качестве фона для обеих кнопок.Вы можете обойти это, создав собственный фон Drawable для каждой кнопки.

0 голосов
/ 06 апреля 2011

Почему бы вам не попробовать определить template внутри цикла?

if (items.size() > 0) {

        for (int i = 0; i < items.size(); i++) {

            View template = inflate(getContext(), R.layout.views_custom_list_item, null);
            template.setBackgroundDrawable(getProperBackgroundDrawable(i, items.size() - 1));

            TextView text = (TextView)template.findViewById(R.id.custom_list_text);
            text.setText(items.get(i));

            Button button = (Button)template.findViewById(R.id.custom_list_button);
            button.setId(i);
            button.setBackgroundDrawable(backgroundButton);

            button.setOnClickListener(callListener);

            addView(template);
        }

    }

Надеюсь, это поможет

EDIT

Попробуйте использовать это для вашего селектора, а также попробуйте добавить его в XML.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Non focused state -->
    <item android:state_focused="false" 
          android:state_pressed="false" 
          android:drawable="@drawable/button_phone"" />
    <!-- Focused state -->
    <item android:state_focused="true" 
          android:state_pressed="false" 
          android:drawable="@drawable/button_phone_over" />   
    <!-- Pressed state -->
    <item android:state_pressed="true" 
          android:drawable="@drawable/button_phone_over" />
 </selector>

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

...