Clickable TableRow на Android

У меня есть простая программа, которую я сделал на Java для Android, но мне трудно сделать строку таблицы доступной для кликов. Когда пользователь щелкает строку, я хочу, чтобы определенное изображение отображалось в изображении ниже. Вот мой xml-код:

     <?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#FF909090"
    android:stretchColumns="1" >

    <TableRow>

        <TextView
            android:layout_margin="2dip"
            android:layout_marginRight="2dip"
            android:background="#0000ff"
            android:padding="3dip"
            android:text="I" />

        <TextView
            android:layout_margin="2dip"
            android:layout_marginLeft="1dip"
            android:background="#0000ff"
            android:gravity="center"
            android:padding="3dip"
            android:text="A"
            android:onClick="Achord" />
    </TableRow>

    <TableRow>

        <TextView
            android:layout_column="0"
            android:layout_margin="2dip"
            android:background="#0000ff"
            android:padding="3dip"
            android:text="II" />

        <TextView
            android:layout_margin="2dip"
            android:background="#0000ff"
            android:gravity="center"
            android:padding="3dip"
            android:text="Bm" />
    </TableRow>

    <TableRow>

        <TextView
            android:layout_column="0"
            android:layout_margin="2dip"
            android:background="#0000ff"
            android:padding="3dip"
            android:text="III" />

        <TextView
            android:layout_margin="2dip"
            android:background="#0000ff"
            android:gravity="center"
            android:padding="3dip"
            android:text="C#m" />
    </TableRow>

    <View
        android:layout_height="2dip"
        android:background="#FF909090" />

    <TableRow android:background="#0000ff" >
    </TableRow>

    <TableRow>

        <TextView
            android:layout_margin="2dip"
            android:background="#0000ff"
            android:padding="3dip"
            android:text="IV" />

        <TextView
            android:layout_margin="2dip"
            android:background="#0000ff"
            android:gravity="center"
            android:padding="3dip"
            android:text="D" />
    </TableRow>

    <View
        android:layout_height="2dip"
        android:background="#FF909090" />

    <TableRow
        android:id="@+id/tableRow1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
    </TableRow>

    <TableRow>

        <TextView
            android:layout_margin="2dip"
            android:layout_marginRight="2dip"
            android:background="#0000ff"
            android:padding="3dip"
            android:text="V" />

        <TextView
            android:layout_margin="2dip"
            android:layout_marginLeft="1dip"
            android:background="#0000ff"
            android:gravity="center"
            android:padding="3dip"
            android:text="E" />
    </TableRow>

    <TableRow>

        <TextView
            android:layout_margin="2dip"
            android:layout_marginRight="2dip"
            android:background="#0000ff"
            android:padding="3dip"
            android:text="VI" />

        <TextView
            android:layout_margin="2dip"
            android:layout_marginLeft="1dip"
            android:background="#0000ff"
            android:gravity="center"
            android:padding="3dip"
            android:text="F#m" />
    </TableRow>

    <TableRow>

        <TextView
            android:layout_margin="2dip"
            android:layout_marginRight="2dip"
            android:background="#0000ff"
            android:padding="3dip"
            android:text="VII" />

        <TextView
            android:layout_margin="2dip"
            android:layout_marginLeft="1dip"
            android:background="#0000ff"
            android:gravity="center"
            android:padding="3dip"
            android:text="G#dim" />
    </TableRow>




    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="0.05"
        android:background="#000000"
        android:maxLines="10"
        android:text="The relative minor of the Major key of A is F#m. The 12 bar blues progression in A is: \n A | A | A | A | D | D | A | A | E | D | A | E" />


    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="0.03"
        android:src="@drawable/android_focused" />

и вот мой java-код:

package com.coreservlets.widgets;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TableRow;
import com.welly.keychords.R;





 public class keya extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.keya);
}
}

я хочу, чтобы imageview1 отображал другое изображение в зависимости от того, какая строка была нажата. Любая помощь будет принята с благодарностью

Как предложил Сэм, я изменил свой код на это:

public class keya extends Activity {

    ImageView imagev = (ImageView) findViewById(R.id.imageView1);

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.keya);
    }

    public void rowClick(View view) {
        switch(view.getId()) {
        case R.id.one:
            // Load image from Drawable folder
            imagev.setImageResource(R.drawable.android_normal); // example file for now
            break;
        }
    }
   }

но теперь у меня есть исключение нулевого указателя при запуске этого класса. хотя все компилируется нормально


person user1505181    schedule 01.11.2012    source источник


Ответы (6)


Просто дайте каждому элементу TableRow уникальный id и определите метод onClick:

<TableRow
    android:id="@+id/one"
    android:onClick="rowClick">

Добавьте переменную класса imageView, которая ссылается на ImageView в вашем макете. Затем загрузите изображение:

public void rowClick(View view) {
    switch(view.getId()) {
    case R.id.one:
        // Load image from Drawable folder
        imageView.setImageResource(R.id.imageOne);
        break;
    }
}

Поймите, что любые элементы внутри TableRow со своим собственным методом onClick будут вызывать свой собственный метод. Например, TextView с android:onClick="Achord" будет вызывать Achord(), а не rowClick().


Дополнение
Вам необходимо вызвать findViewById() после объявления макета с помощью setContentView() в onCreate().

ImageView imagev;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.keya);
    imagev = (ImageView) findViewById(R.id.imageView1);
}
person Sam    schedule 01.11.2012
comment
я изменил свой код на это: ключ открытого класса расширяет активность {ImageView imagev = (ImageView) findViewById (R.id.imageView1); @Override public void onCreate (Bundle saveInstanceState) { super.onCreate (savedInstanceState); setContentView(R.layout.keya); } public void rowClick(View view) { switch(view.getId()) { case R.id.one: imagev.setImageResource(R.drawable.android_normal); ломать; } } } но имеет исключение нулевого указателя при запуске - person user1505181; 02.11.2012
comment
пожалуйста, посмотрите мой отредактированный первый пост sam, так как поле для комментариев не любит код - person user1505181; 02.11.2012
comment
Да, комментарии имеют минимальные возможности разметки. Спасибо за добавление кода к вашему вопросу, я надеюсь, что обновление сделает ответ ясным. - person Sam; 02.11.2012

Дайте каждой строке идентификатор, затем вы можете назначить слушателя каждому в своем коде:

TableRow row = (TableRow)findViewById( R.id.row1 );
row.setOnClickListener( new OnClickListener() {
    @Override
    public void onClick( View v ) {
        //Do Stuff
    }
} );
person Ralgha    schedule 01.11.2012

Вам нужно вызвать setOnClickListener() для каждого из ваших объектов TableRow, чтобы фреймворк знал, что делать при щелчке по строке. Кроме того, ваша активность должна реализовывать View.OnClickListener(), чтобы вы могли контролировать, что происходит при нажатии на строку. Прямо сейчас вы ничего не делаете, когда щелкаете View; по крайней мере, согласно вашему коду, вы не регистрируете обратный вызов ни в одном из представлений onClickListeners

person David C. Sainte-Claire    schedule 01.11.2012

Назначьте идентификатор Tablerow так же, как row1

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="#FF909090"
        android:stretchColumns="1" >

        <TableRow
            android:id="@+id/row1"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"

            >

            <TextView
                android:layout_margin="2dip"
                android:layout_marginRight="2dip"
                android:background="#0000ff"
                android:padding="3dip"
                android:text="I" />

            <TextView
                android:layout_margin="2dip"
                android:layout_marginLeft="1dip"
                android:background="#0000ff"
                android:gravity="center"
                android:padding="3dip"
                android:text="A"
                android:onClick="Achord" />
        </TableRow>

        <TableRow>

            <TextView
                android:layout_column="0"
                android:layout_margin="2dip"
                android:background="#0000ff"
                android:padding="3dip"
                android:text="II" />

            <TextView
                android:layout_margin="2dip"
                android:background="#0000ff"
                android:gravity="center"
                android:padding="3dip"
                android:text="Bm" />
        </TableRow>

        <TableRow>

            <TextView
                android:layout_column="0"
                android:layout_margin="2dip"
                android:background="#0000ff"
                android:padding="3dip"
                android:text="III" />

            <TextView
                android:layout_margin="2dip"
                android:background="#0000ff"
                android:gravity="center"
                android:padding="3dip"
                android:text="C#m" />
        </TableRow>

        <View
            android:layout_height="2dip"
            android:background="#FF909090" />

        <TableRow android:background="#0000ff" >
        </TableRow>

        <TableRow>

            <TextView
                android:layout_margin="2dip"
                android:background="#0000ff"
                android:padding="3dip"
                android:text="IV" />

            <TextView
                android:layout_margin="2dip"
                android:background="#0000ff"
                android:gravity="center"
                android:padding="3dip"
                android:text="D" />
        </TableRow>

        <View
            android:layout_height="2dip"
            android:background="#FF909090" />

        <TableRow
            android:id="@+id/tableRow1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >
        </TableRow>

        <TableRow>

            <TextView
                android:layout_margin="2dip"
                android:layout_marginRight="2dip"
                android:background="#0000ff"
                android:padding="3dip"
                android:text="V" />

            <TextView
                android:layout_margin="2dip"
                android:layout_marginLeft="1dip"
                android:background="#0000ff"
                android:gravity="center"
                android:padding="3dip"
                android:text="E" />
        </TableRow>

        <TableRow>

            <TextView
                android:layout_margin="2dip"
                android:layout_marginRight="2dip"
                android:background="#0000ff"
                android:padding="3dip"
                android:text="VI" />

            <TextView
                android:layout_margin="2dip"
                android:layout_marginLeft="1dip"
                android:background="#0000ff"
                android:gravity="center"
                android:padding="3dip"
                android:text="F#m" />
        </TableRow>

        <TableRow>

            <TextView
                android:layout_margin="2dip"
                android:layout_marginRight="2dip"
                android:background="#0000ff"
                android:padding="3dip"
                android:text="VII" />

            <TextView
                android:layout_margin="2dip"
                android:layout_marginLeft="1dip"
                android:background="#0000ff"
                android:gravity="center"
                android:padding="3dip"
                android:text="G#dim" />
        </TableRow>




        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="0.05"
            android:background="#000000"
            android:maxLines="10"
            android:text="The relative minor of the Major key of A is F#m. The 12 bar blues progression in A is: \n A | A | A | A | D | D | A | A | E | D | A | E" />


        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="0.03" />
        </TableLayout>

Назовите это в действии, как это.

        import android.app.Activity;
        import android.content.Intent;
        import android.os.Bundle;
        import android.view.View;
        import android.widget.TableRow;
        import com.welly.keychords.R;

        public class keya extends Activity {
            TableRow row1;


        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.keya);
        row1 = (TableRow) findViewById(R.id.row1);
                row1.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View arg0) {
                        // TODO Auto-generated method stub
                        Log.e("Click ", "Row 1");
                    }
                });

        }
        }
person Imran Ali    schedule 01.11.2012

я заработал, объявив переменную imageview в public void rowclick

person user1505181    schedule 01.11.2012

  1. Назначьте идентификатор Tablerow в файле макета xml:

     <TableRow
            android:id="@+id/rowL1"
            ...
     </TableRow>
    
  2. Добавьте в свой java-файл следующее:

    private TableRow rowL1;  
    
    //In onCreateView...
    rowL1 = (TableRow) rootView.findViewById(R.id.rowL1);
    rowL1.setOnClickListener(v -> {
        //Your code here...
    });
    
person Pablo Alfonso    schedule 15.01.2020