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
промених кода си на следния: 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: imagev.setImageResource(R.drawable.android_normal); прекъсване; } } }, но има изключение за nullpointer при изпълнение - person user1505181; 02.11.2012
comment
моля, вижте моята редактирана първа публикация Сам, тъй като полето за коментари не харесва кода - person user1505181; 02.11.2012
comment
Да, коментарите имат минимални функции за маркиране. Благодаря, че добавихте кода към въпроса си, надявам се актуализацията да направи отговора ясен. - person Sam; 02.11.2012

Дайте на всеки ред ID, след което можете да присвоите слушател на всеки един от вашия код:

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(), така че да можете да контролирате какво се случва, когато се щракне върху ред. В момента не правите нищо, когато се щракне върху изгледа; поне според вашия код вие не регистрирате обратно извикване на никой от onClickListeners на Views

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