在公共虚空之外传递值onClick

时间:2011-07-27 22:38:55

标签: android class onclick integer

所以我相信这可能是一个相当容易的问题,但我很难过,因为我是初学者。

我希望将一个值从一个类传递给另一个类,并且我的帮助函数已经关闭并且正常工作。如果我在我的onClick之外创建一个整数,我可以传递它没有问题。如果我在onClick中创建它,虽然它似乎没有成功。

package com.movi.easypar;

//import java.util.logging.Handler;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.TranslateAnimation;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;


public class EntryScreen extends Activity implements OnClickListener {

Button buttonSetHoles, buttonSetPlayers, buttonLetsGo;
TextView textGameSetup;
public int setHoles; <--- declared here###############################
private String name1 = "Crista";
private String name2 = "Rob";
private String name3 = "Gato";
private String name4 = "Movi";



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


    //******************//
    //***DEFINE FONTS***//
    //******************//
    Typeface merge = Typeface.createFromAsset(getAssets(), "merge.otf");

    //*****************************************************//
    //***CREATES THE UI FOR EACH OF THESE IN JAVA MEMORY***//
    //*****************************************************//
    buttonSetHoles = (Button)findViewById(R.id.buttonSetHoles);
    buttonSetPlayers = (Button)findViewById(R.id.buttonSetPlayers);
    buttonLetsGo = (Button)findViewById(R.id.buttonLetsGo);
    textGameSetup = (TextView)findViewById(R.id.textGameSetup);
    buttonSetHoles.setTypeface(merge);
    buttonSetPlayers.setTypeface(merge);
    buttonLetsGo.setTypeface(merge);
    textGameSetup.setTypeface(merge);
    buttonSetHoles.setText("Set Holes");
    buttonLetsGo.setText("Lets Go");
    buttonSetPlayers.setText("Set Players");

    //******************************//
    //***DEFINES BUTTON LISTENERS***//
    //******************************//
    buttonSetHoles.setOnClickListener(this);
    buttonSetPlayers.setOnClickListener(this);
    buttonLetsGo.setOnClickListener(this);
}






//*************************************************//
//***SETS ON CLICK FUNCTIONALITY FOR ALL BUTTONS***//
//*************************************************//
@Override
public void onClick(View src) {

    switch(src.getId()){

    case R.id.buttonSetPlayers:
        break;

    case R.id.buttonSetHoles:
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        final CharSequence[] items = {"18", "9"};
        builder.setTitle("Set Holes");
        builder.setItems(items, new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialogInterface, int item) {
                Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
                if (items[item].equals("9")){
                    EntryScreen.this.setHoles = 9; <---#### VALUE SET HERE ####

                }
                else if (items[item].equals("18")){
                    EntryScreen.this.setHoles = 18;

                }

                return;
            }
        });
        builder.create().show();

        return;

    case R.id.buttonLetsGo:
        //*********************************//
        //***LAUNCHES ACTUAL APPLICATION***//
        //*********************************//
        TranslateAnimation slide = new TranslateAnimation(0, -500, 0,0 );
        slide.setDuration(1000);   
        slide.setFillAfter(true);
        buttonLetsGo.startAnimation(slide);
        buttonSetPlayers.startAnimation(slide);
        buttonSetHoles.startAnimation(slide);
        Intent myIntent = new Intent(src.getContext(), EasyPar.class);
        startActivityForResult(myIntent, 0);
        break;
    }
    EntryScreen.this.finish();
}   


public String getNames() {
    return name1;
}

public void setNames(String playerName1) {
    name1 = playerName1;
}

public int getHoles() {
    return setHoles;  <---- #### THIS DOES NOT SEE VALUE SET IN ONCLICK ####
}
}

这个帮助器似乎无法看到在onClick上创建的setHoles值。

有什么建议吗?提前谢谢!

5 个答案:

答案 0 :(得分:2)

这是一个范围的事情。函数中定义的变量具有局部范围,并在函数返回时被销毁。如果你想保留它,你需要一个字段来保存你的价值。

[编辑]
然后请允许我详细说明。您可以通过在类中输入以下行来创建字段:

[访问] [类型] [姓名];

前:

class foo{
    public int dice;
    public void onClick(){
         //now the dice's value is saved throught the lifecycle of the Activity
    }
}

[编辑] 我复制了你的代码然后运行它。 (稍微修改一下。)

public class Main extends Activity implements OnClickListener {

Button buttonSetHoles, buttonSetPlayers, buttonLetsGo;
TextView textGameSetup;
public int setHoles; //<--- declared here###############################
private String name1 = "Crista";
private String name2 = "Rob";
private String name3 = "Gato";
private String name4 = "Movi";

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

    //******************//
    //***DEFINE FONTS***//
    //******************//
    Typeface merge = Typeface.createFromAsset(getAssets(), "merge.otf");

    //*****************************************************//
    //***CREATES THE UI FOR EACH OF THESE IN JAVA MEMORY***//
    //*****************************************************//
    /*

    buttonSetPlayers = (Button)findViewById(R.id.buttonSetPlayers);
    buttonLetsGo = (Button)findViewById(R.id.buttonLetsGo);
    textGameSetup = (TextView)findViewById(R.id.textGameSetup);
    */
    buttonSetHoles = (Button) findViewById(R.id.buttonSetHoles);
    /*
    buttonSetHoles.setTypeface(merge);
    buttonSetPlayers.setTypeface(merge);
    buttonLetsGo.setTypeface(merge);
    textGameSetup.setTypeface(merge);
    buttonSetHoles.setText("Set Holes");
    buttonLetsGo.setText("Lets Go");
    buttonSetPlayers.setText("Set Players");
    */

    //******************************//
    //***DEFINES BUTTON LISTENERS***//
    //******************************//.
    buttonSetHoles.setOnClickListener(this);
    /*
    buttonSetPlayers.setOnClickListener(this);
    buttonLetsGo.setOnClickListener(this);
    */
}

//*************************************************//
//***SETS ON CLICK FUNCTIONALITY FOR ALL BUTTONS***//
//*************************************************//
@Override
public void onClick(View src) {

    switch (src.getId()) {

        case R.id.buttonSetHoles:
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            final CharSequence[] items = { "18", "9" };
            builder.setTitle("Set Holes");
            builder.setItems(items, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialogInterface, int item) {
                    Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
                    if (items[item].equals("9")) {
                        setHoles = 9;// <---#### VALUE SET HERE ####
                        Toast.makeText(Main.this, "getHoles()=" + getHoles(), Toast.LENGTH_SHORT);
                    }
                    else if (items[item].equals("18")) {
                        setHoles = 18;
                        Toast.makeText(Main.this, "getHoles()=" + getHoles(), Toast.LENGTH_SHORT);
                    }

                    return;
                }
            });
            builder.create().show();

            return;

    }
    //finish();
}

public String getNames() {
    return name1;
}

public void setNames(String playerName1) {
    name1 = playerName1;
}

public int getHoles() {
    return setHoles;
}
}

它似乎工作正常。

答案 1 :(得分:0)

如果在方法中声明变量,外部方法肯定无法看到它,它不在同一范围内,你仍然可以在外面声明它,然后在onClick()方法中设置一个值

答案 2 :(得分:0)

在方法之外将其声明为public/private变量。

答案 3 :(得分:0)

你确定你的setHoles甚至被设置了吗?到9或18?尝试在onclick中添加println(setHoles)以确保正确设置该值。另外,你是在onCreate之外声明你的setHoles变量,但是在与getHoles()和onClick()相同的类中对吗?

答案 4 :(得分:0)

比较Strings时始终使用equal方法。 像:

  if (items[item].equals( "9")){
}

我更喜欢在变量上使用SettersGetters

setHoles(int value){}

int getHoles(){}