【问题标题】:Android startActivityForResult()Android startActivityForResult()
【发布时间】:2015-04-26 16:32:51
【问题描述】:

我刚开始学习 android 编程,但在启动 Activity for Result 时遇到问题(使用 onActivityResult()、setResult())。

首先,有三个活动 - Main,Register,SubActivity(但我的问题是关于两个活动 - Main,Register)。我将它们全部注册到“AndroidManifest.xml”,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.wakwakwak.iwak.myapp" >
    <uses-permission android:name="android.permission.VIBRATE"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".Main"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".SubActivity"
            android:label="Here is SubWorld!">

        </activity>
        <activity android:name=".Register"
            android:label="Register">

        </activity>
    </application>

</manifest>

如您所见,成功注册了三个活动。

这是主要活动。

如果我触摸“REG”按钮,我们将转到“Register”活动。

如果 REG 被触摸,Register Activity 返回信息给 Main Activity,Main Activity 将它保存到 ArrayList。

下面的代码是 Main Activity(Main.java)。

package com.wakwakwak.iwak.myapp;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Vibrator;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import java.util.ArrayList;


public class Main extends Activity {
    private static ArrayList<Person> users;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Vibrator vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
        vibrator.vibrate(300);
    }

    public void onClick(View v){
        EditText edId = (EditText)findViewById(R.id.edit_id);
        EditText edPw = (EditText)findViewById(R.id.edit_pw);
        Vibrator vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
        switch(v.getId()){
            case R.id.btn_login:
                vibrator.vibrate(300);
                Person person = new Person(edId.getText().toString(),edPw.getText().toString());

                Intent intent1 = new Intent(this, SubActivity.class);
                intent1.putExtra("person",person);
                startActivity(intent1);
                break;
            case R.id.btn_register:
                vibrator.vibrate(300);
                Intent intent2 = new Intent(this,Register.class);
                startActivityForResult(intent2, 0);
                break;
        }    
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch(requestCode)
        {
            case 0:
                Person person = (Person)data.getSerializableExtra("person");
                users.add(person);
                 Toast.makeText(this,person.toString(),Toast.LENGTH_SHORT).show();
                break;
        }
    }
}

下面的代码是Register Activity(Register.java)

package com.wakwakwak.iwak.myapp;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class Register extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);
    }

    public void onClick(View view) {
        EditText editId = (EditText)findViewById(R.id.edit_id);
        EditText editPw = (EditText)findViewById(R.id.edit_pw);
        EditText editPwAgain = (EditText)findViewById(R.id.edit_pwagain);
        switch(view.getId()){
            case R.id.btn_register:
                if(!editPw.getText().toString().equals(editPwAgain.getText().toString())){
                    editPw.setText("");
                    editPwAgain.setText("");
                    Toast.makeText(this,"Passwords are not equal each other",Toast.LENGTH_SHORT).show();
                }
                else{
                    Person person = new Person(editId.getText().toString(),editPw.getText().toString());
                    Intent intent2 = new Intent();
                    intent2.putExtra("person",person);
                    setResult(0,intent2);
                    finish();
                }
                break;
        }
    }
}

(Person 是一个有成员 'id' 和 'pw' 的类。看来 Person 类没有问题)

似乎注册活动本身运作良好 - 当每个密码不同时它会显示错误吐司,但是当它们都相同时(传递给主活动时),发生错误:'Myapp is stopped' 我真的不知道什么问题!!请让我知道出了什么问题:(

【问题讨论】:

    标签: android android-intent


    【解决方案1】:

    当它们都相同时(传递给 Main 活动时),错误 发生:'Myapp 已停止'

    onActivityResult 中调用add 方法时,可能会得到NPE 异常users ArrayList 是null。在onCreate 方法中添加以下行:

    users=new ArrayList<Person>();
    

    【讨论】:

      【解决方案2】:

      person 类可以打包吗?因为您不能将不可打包的自定义类对象传递给意图?

      请检查 logcat 是否有错误 .. 以便我们更好地提供帮助。

      【讨论】:

        猜你喜欢
        • 2018-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多