Надутые кнопки макета onClick слушатель не работает - PullRequest
11 голосов
/ 26 марта 2011

Все мои другие методы onClick работают, кроме тех, в которых мне нужно надуть макет, чтобы получить кнопку! Что я делаю неправильно! Вот некоторый код:

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() {




    }



    }

Вот мои xml-файлы: 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>

Вот мой уровень. 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>

Вот 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>

Ответы [ 7 ]

22 голосов
/ 29 марта 2011

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

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

. Вы захотите поместить родительское представление во второй аргумент.

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

Это позволит вам использовать родительское представление, нона самом деле не прикрепить его.

1 голос
/ 30 марта 2011

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

0 голосов
/ 13 декабря 2017

Попробуйте после того, как tbl.addView(updateLevel); 0 из tbl.getChildAt(0) может измениться:

tbl.getChildAt(0).findViewById(R.id.updateLevel).setOnClickListener( new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        updateLevelOnClick(v);
    }
});
0 голосов
/ 23 августа 2017

Если вы хотите, чтобы значение элемента при щелчке элемента просто использовалось .setTag (некоторое значение); и 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);
        }
    });
0 голосов
/ 04 апреля 2011

Инфляция - это асинхронный метод, можете ли вы попытаться добавить прослушиватель кликов после его накачанного

    //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);
           }
         });
     }
0 голосов
/ 03 апреля 2011

Вы должны увидеть исключение на tbl.addView(updateLevel);, потому что вы пытаетесь добавить представление, чей родитель уже указан.

Вы не видите это исключение?

0 голосов
/ 29 марта 2011

Нет очевидной причины, по которой это не должно работать.

Любые созданные во время выполнения представления должны быть добавлены в линейный макет (или любой другой родительский макет), используя:

linearLayoutMain.addView(updateLevel);

Есть ли у васиспользовал эти кнопки в любом из линейных макетов в вашем XML-файле, т.е. эти кнопки появляются, когда вы достигаете соответствующего действия?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...