将计数器从一个活动传递到另一个活动

时间:2012-07-13 21:05:25

标签: android bundle android-activity

我有一个Voice课,它扩展了Activity,并包含一个计数器。当用户正确回答时,计数器会通过counter++;

添加一个
public class Voice  extends Activity implements OnClickListener{
    ListView lv;
    static final int check = 111;
    int counter_score;
    TextView txView;
    MediaPlayer ourSong;
    ImageView display;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.letter_a);
        initialize();
    }

    private void initialize() {
        lv = (ListView)findViewById(R.id.lvVoiceReturn);
        Button b = (Button)findViewById(R.id.imageButtonSelector);
        txView = (TextView)findViewById(R.id.counter);
        b.setOnClickListener(this);
        counter_score=0;
    }

此分数被捆绑并传递到字符串“您的分数为1”中的下一个活动“内容”。

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == check && resultCode == RESULT_OK) {
        ArrayList<String> results = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
        lv.setAdapter( new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, results));

        if(results.contains("hey") || results.contains("a") || results.contains("ay")) {
            //toast referenced to xml the after 400ms
            counter_score++;
            txView.setText("Your Score is" + " " + counter_score);

            AlertDialog dialogBuilder = new AlertDialog.Builder(this).create();
            dialogBuilder.setTitle("AWSOME");
            dialogBuilder.setMessage("¡Your current score is" + counter_score);
            dialogBuilder.setIcon(R.drawable.ic_mark);
            dialogBuilder.show();

            ourSong = MediaPlayer.create(Voice.this, R.raw.rightsound2);
            ourSong.start();
            Thread timer = new Thread() {
                public void run(){
                try {
                    sleep(2500);
                }catch (InterruptedException e){
                    e.printStackTrace();
                } finally {
                    String score = txView.getText().toString();
                    Bundle keeper = new Bundle();
                    keeper.putString("key", score);
                    Intent putScore = new Intent(Voice.this, What.class);
                    putScore.putExtras(keeper);
                    startActivity(putScore);
                }
            }
        };

        timer.start();
    }
}

下一个ActivityWhat获取此Bundle并使用setText(gotScore)

显示正常
public class What  extends Activity implements OnClickListener {
    ListView lv;
    static final int check = 111;
    private int counter_score;
    TextView txView;
    MediaPlayer ourSong;
    ImageView display;
    String gotScore;

    String classes[] = {"What", "Pagina", "What", "example3", "example4", "example5", 
                        "example6"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.letter_b);
        initialize();
        Bundle gotKeeper = getIntent().getExtras();
        gotScore = gotKeeper.getString("key");
        txView.setText(gotScore);
    }

    private void initialize() {
        // TODO Auto-generated method stub
        lv = (ListView)findViewById(R.id.lvVoiceReturn);
        Button b = (Button)findViewById(R.id.imageButtonSelector);
        txView = (TextView)findViewById(R.id.counter);
        b.setOnClickListener(this);

..这是事情变坏的时候:(

What我还有另一个与计数器相关的问题。当用户正确回答时,计数器会通过counter++;添加一个,但确实如此。但是,它会将txview string更改为“您的分数为1”。我无法将它添加到从字符串中的上一个活动传递的计数器结果中,以便What上的计数器显示“您的分数为2”。这将传递给Bundle keeper中的下一个活动,该活动保持总分。

我已经阅读了一些关于传递int经文string的教程,但是他们使用的一些代码如getInt无法识别。我很难过。

3 个答案:

答案 0 :(得分:0)

您要捆绑并传递给什么活动不是计数器而是字符串&#34;您的分数是1&#34;。如果你想在下一个活动中增加那个数字,那么你应该只发送整数值并构造你需要的任何字符串。

  

我已经阅读了一些关于传递一个int与一个字符串的内容。但是他们使用的一些代码如getInt是无法识别的......我很难过......

我不太确定我知道你的意思getInt()无法识别。无论如何,在将反击从一个活动传递到另一个活动时,让自己更容易。如果它是一个int并且您计划在接收活动中像int一样进行操作,那么将它作为int添加到bundle中。例如:

    Bundle keeper = new Bundle();
    keeper.putInt("key", counter_score);

并从包中检索它:

    Bundle gotKeeper = getIntent().getExtras();
    int score = gotKeeper.getInt("key");

答案 1 :(得分:0)

如果您要在不同的活动中共享“全局”类,并使用它来保持变量“同步”,该怎么办?

例如 - Globals.java:

public class Globals {

  public int counter_score; 

}

然后使用Globals.counter_score

引用该变量

当然,您也可以将该共享类用于其他变量和函数 - 例如常见操作。

更新

正如评论者指出的那样,这种方法并不特别好 - 我忘记了代码只是简单引用,并且没有自己“活着”来保存其他活动的信息(感谢您纠正我的一,我还在学习...)

但是,可以更好地工作的是在启动第二个活动时在intent中传递counter_score变量的当前状态 - 例如:

IntentToLaunchTheOtherActivity( counter_score );

然后可能会将变量传回上一个活动,如果之后发生了变化......

答案 2 :(得分:0)

我明白了。基本上我需要TJ Third建议将keeper.putString("key", counter_score);转换为keeper.putInt("key", counter_score);的内容,我还需要将收到的包转换为“What”活动中的int。在“What”活动中,我重命名为int counter_score;int gotKeeper;(这是String gotKeeper),而不是调用counter_score = 0;既然传递的bundle是一个int,我调用了counter_score = gotKeeper;在initialize()下;所以计数器分数等于上一个活动“语音”产生的结果。

现在当用户正确回答时,反问译++;在现有的counter_score中添加一个并捆绑它并将其发送到下一个活动,并冲洗重复。

static final int check = 111;
    int counter_score;
    TextView txView;
    MediaPlayer ourSong;
    ImageView display;
    int gotKeeper;


    String classes[] = {"What", "Pagina", "What", "example3", "example4", "example5", 
    "example6"};


@Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.letter_b);
        initialize();
        Bundle gotKeeper = getIntent().getExtras();
        gotKeeper = gotScore.getInt("key");
        counter_score = gotKeeper;

再次向大家致以建议和见解。帮助新手。