Передать значение за пределами публичного void onClick - PullRequest
0 голосов
/ 28 июля 2011

Так что я уверен, что это, вероятно, довольно простой вопрос, но я озадачен, потому что я новичок.

Я хочу передать значение из одного класса в другой, и у меня отключена вспомогательная функция иработает просто отлично.Если я создаю целое число вне моего 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 ####
}
}

Похоже, что этот помощник не может увидеть значение setHoles, созданное в onClick.

Какие-либо предложения?Заранее спасибо!

Ответы [ 5 ]

2 голосов
/ 28 июля 2011

Это предметная область. Переменная, определенная в функции, имеет локальную область видимости и будет уничтожена, когда функция вернется Вам нужно поле для хранения вашего значения, если вы хотите сохранить его.

[EDIT]
Тогда позвольте мне уточнить. Вы можете создать поле, введя следующую строку вне функции внутри класса:

[Доступ] [Тип] [имя];

например:

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

[EDIT] Я скопировал ваш код и запустил его. (Изменено только немного.)

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

И, кажется, работает нормально.

0 голосов
/ 28 июля 2011

при сравнении Strings всегда используйте equal метод.как:

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

и я предпочитаю пользователя Setters и Getters для переменных:

setHoles(int value){}

и

int getHoles(){}

0 голосов
/ 28 июля 2011

Объявите его как public/private переменную вне методов.

0 голосов
/ 28 июля 2011

Вы уверены, что ваши setHoles даже установлены? до 9 или 18? попробуйте добавить println (setHoles) в свой клик, чтобы убедиться, что значение установлено правильно. Кроме того, вы объявляете переменную setHoles вне onCreate, но в том же классе, что и getHoles () и onClick (), верно?

0 голосов
/ 28 июля 2011

Если вы объявляете переменную внутри метода, внешний метод наверняка не сможет ее увидеть, он не находится в той же области, вы все равно можете объявить ее снаружи и затем установить значение из метода onClick().

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