java 膨胀布局的按钮 onClick 侦听器不起作用

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/5444516/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 11:09:55  来源:igfitidea点击:

Inflated layout's buttons onClick listener not working

javaandroidonclick

提问by Andrew delgadillo

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:

我所有其他的 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() {




    }



    }

Here are my xml files: Main.xml:

这是我的 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>

Here is my level.xml

这是我的 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:

这是 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>

回答by Brian Griffey

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.

这将允许您使用父视图但不实际附加它。

回答by BigFwoosh

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?

所以按钮在你的关卡和播放布局中,你在膨胀这些布局,但看起来你从来没有将布局添加到你的主视图/布局中。你真的能够看到你正在膨胀的那两个布局吗?

回答by Riyaz Mohammed Ibrahim

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);
           }
         });
     }

回答by Sagar

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

如果您想要项目上的项目值单击只需使用.setTag(some value); 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);
        }
    });

回答by Taku Koyahata

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

tbl.addView(updateLevel);0 oftbl.getChildAt(0)可能改变后试试这个:

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

回答by Karan

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

您应该在 处看到异常tbl.addView(updateLevel);,因为您正在尝试添加已指定父视图的视图。

Are you not seeing this exception ?

你没有看到这个异常吗?

回答by Vicky Kapadia

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?

您是否在 xml 文件中的任何线性布局中使用过此按钮,即当您到达相应的活动时是否会出现这些按钮?