Andrew delgadillo
Andrew delgadillo

Reputation: 714

Inflated layout's buttons onClick listener not working

All my other onClick methods work except the ones in which I have to inflate the layout to get the button! What am I doing wrong! Here is some code:

package com.games.think;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;

import android.widget.Button;
import android.widget.RadioButton;
import android.widget.TableLayout;

public class Think extends Activity{
    //What question are we on?
    int question = 1;
    //What level are we on?
    String lvl ="1";

    //Radio buttons we need to access them global
    RadioButton lvl1;
    RadioButton lvl2;
    RadioButton lvl3;
    RadioButton lvl4;
    RadioButton lvl5;

     /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //play
        Button play = (Button)findViewById(R.id.play);
        play.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                playOnClick(v);

            }
        });
        //level
        Button level = (Button)findViewById(R.id.level);
        level.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                levelOnClick(v);

            }
        });

        //setLevel
        LayoutInflater  inflater = LayoutInflater.from(this);
        TableLayout tbl = new TableLayout(this);

        View playv = inflater.inflate(R.layout.level, null);
        Button updateLevel = (Button) playv.findViewById(R.id.updateLevel);
        tbl.addView(updateLevel);

        updateLevel.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    updateLevelOnClick(v);
                }
            });

        View levelv = inflater.inflate(R.layout.play, null);
        Button gotomenu = (Button) levelv.findViewById(R.id.tomenu);

        gotomenu.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    toMenuOnClick(v);
                }
            });





       //Radio Buttons
        lvl1 = (RadioButton) levelv.findViewById(R.id.lvl1);

        lvl2 = (RadioButton) levelv.findViewById(R.id.lvl2);

        lvl3 = (RadioButton) levelv.findViewById(R.id.lvl3);

        lvl4 = (RadioButton) levelv.findViewById(R.id.lvl4);

        lvl5 = (RadioButton) levelv.findViewById(R.id.lvl5);
       //tomenu


        lvl = getLevel();


        if(lvl.equals("-1")) {
            lvl=getLevel();

        }






    }




    protected void toMenuOnClick(View v) {
        setContentView(R.layout.main);

    }




    protected void updateLevelOnClick(View v) {

        setContentView(R.layout.main);


    }




    protected void levelOnClick(View v) {
        setContentView(R.layout.level);


        if(lvl.equals("1")) {
            lvl1.setChecked(true);
        }
        if(lvl.equals("2")) {
            lvl2.setChecked(true);
        }
        if(lvl.equals("3")) {
            lvl3.setChecked(true);
        }
        if(lvl.equals("4")) {
            lvl4.setChecked(true);
        }
        if(lvl.equals("5")) {
            lvl5.setChecked(true);
        }

    }




    protected void playOnClick(View v) {
        setContentView(R.layout.play);


        setQuestion();


    }






    private String getLevel() {

        String FILENAME = "think_level";
        FileInputStream fis;
        byte[] buffer = new byte[1000];


        try {
            fis = openFileInput(FILENAME);
        } catch (FileNotFoundException e) {
            setLevel("1");
            return "-1";
        }

        try {
            fis.read(buffer,0,1000);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            fis.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        String level = buffer.toString();

        return level;
    }

    private void setLevel(String _level) {
        String FILENAME = "think_level";
        String level = _level;

        FileOutputStream fos;
        try {
            fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
            fos.write(level.getBytes());
            fos.close();
        } catch (Exception e) {

            e.printStackTrace();

        }

    }

    private void setQuestion() {




    }



    }

Here are my xml files: Main.xml:

<?xml version="1.0" encoding="utf-8"?>

    <TableLayout android:id="@+id/tableLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android">
        <ImageView android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/imageView1" android:src="@drawable/think" android:scaleType="fitCenter"></ImageView>
        <Button android:id="@+id/play" android:text="Play" android:layout_height="wrap_content" android:layout_width="wrap_content" ></Button>
        <Button android:text="Level" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/level"></Button>


    </TableLayout>

Here is my level.xml

<?xml version="1.0" encoding="utf-8"?>
    <TableLayout android:id="@+id/tableLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android">
        <TableRow android:id="@+id/tableRow1" android:layout_width="wrap_content" android:layout_height="wrap_content">
            <TextView android:text="Level:" android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
        </TableRow>
        <TableRow android:id="@+id/tableRow2" android:layout_width="wrap_content" android:layout_height="wrap_content">
            <RadioGroup android:id="@+id/radioGroup1" android:layout_width="wrap_content" android:layout_height="wrap_content">
                <RadioButton android:id="@+id/lvl1" android:text="Level 1" android:layout_height="wrap_content" android:checked="true" android:layout_width="wrap_content"></RadioButton>
                <RadioButton android:id="@+id/lvl2" android:text="Level 2" android:layout_height="wrap_content" android:layout_width="wrap_content"></RadioButton>
                <RadioButton android:id="@+id/lvl3" android:text="Level 3" android:layout_height="wrap_content" android:layout_width="wrap_content"></RadioButton>
                <RadioButton android:id="@+id/lvl4" android:text="Level 4" android:layout_height="wrap_content" android:layout_width="wrap_content"></RadioButton>
                <RadioButton android:id="@+id/lvl5" android:text="Level 5" android:layout_height="wrap_content" android:layout_width="wrap_content"></RadioButton>
            </RadioGroup>
        </TableRow>
        <Button android:text="Set Level" android:id="@+id/updateLevel" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
    </TableLayout>

Here is play.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">
    <ScrollView android:id="@+id/scrollView1" android:layout_width="wrap_content" android:layout_height="wrap_content">
        <TextView android:text="TextView" android:id="@+id/question" android:layout_height="wrap_content" android:layout_width="wrap_content"></TextView>
    </ScrollView>
    <RadioGroup android:id="@+id/radioGroup1" android:layout_width="wrap_content" android:layout_height="wrap_content" >
        <RadioButton android:id="@+id/radioButton1" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="RadioButton"></RadioButton>
        <RadioButton android:id="@+id/radioButton2" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="RadioButton"></RadioButton>
        <RadioButton android:id="@+id/radioButton3" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="RadioButton"></RadioButton>
    </RadioGroup>
    <Button android:id="@+id/go" android:text="Go" android:layout_height="wrap_content" android:layout_width="wrap_content"></Button>
    <Button android:id="@+id/tomenu" android:text="Back To Menu" android:layout_height="wrap_content" android:layout_width="wrap_content"></Button>
</TableLayout>

Upvotes: 11

Views: 14437

Answers (7)

Taku Koyahata
Taku Koyahata

Reputation: 558

Try this after tbl.addView(updateLevel); 0 of tbl.getChildAt(0) may change:

tbl.getChildAt(0).findViewById(R.id.updateLevel).setOnClickListener( new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        updateLevelOnClick(v);
    }
});

Upvotes: 0

Sagar H
Sagar H

Reputation: 5541

If You want item value on item click just use .setTag(some value); and getTag();

RelativeLayout firstContactRlayout = (RelativeLayout) myLayout.findViewById(R.id.firstContactRlayout);
    firstContactRlayout.setTag(number);
    firstContactRlayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String gettags = (String) v.getTag();
            Log.e("gettags", "--" + gettags);
        }
    });

Upvotes: 0

Riyaz Mohammed Ibrahim
Riyaz Mohammed Ibrahim

Reputation: 9595

inflation is async method, can you try to add the click listener after its inflated

    //only inflate in oncreate / onresume
    inflater.inflate(
            R.layout.play,  // resource
            this,                // root
            true); //attach to root

 //overide onFinishInflate and get the view here
    protected void onFinishInflate() {
     super.onFinishInflate();
     Button gotomenu = (Button) levelv.findViewById(R.id.tomenu);

     gotomenu.setOnClickListener(new View.OnClickListener() {
         @Override
          public void onClick(View v) {
             toMenuOnClick(v);
           }
         });
     }

Upvotes: 1

Karan
Karan

Reputation: 12782

You should be seeing the exception at tbl.addView(updateLevel);, because you are trying to add a view whose parent is already specified.

Are you not seeing this exception ?

Upvotes: 0

BigFwoosh
BigFwoosh

Reputation: 1197

So the buttons are in your level and play layouts, and you're inflating those layouts, but it doesn't look like you're ever adding the layouts to the your main view/layout. Are you actually able to see those two layouts you are inflating?

Upvotes: 1

Brian Griffey
Brian Griffey

Reputation: 4751

The problem is that the view you are adding does not have a parent and therefore is not able to receive click events. Currently you're inflating the view using

View playv = inflater.inflate(R.layout.level, null);

You'll want to place a parent view in that second argument.

View playv = inflater.inflate(R.layout.level, parentView, false);

This will allow you to use a parent view but not actually attach it.

Upvotes: 26

Vicky Kapadia
Vicky Kapadia

Reputation: 6081

There is no apparent reason why this should not work.

Any runtime created views must be added to your linearlayout(or any other parent layout) using :

linearLayoutMain.addView(updateLevel);

Have you used this buttons in any of the linear layouts in your xml file i.e. does these buttons appear when you reach the corresponding activity?

Upvotes: 0

Related Questions