java - 将 startActivityForResult 和 onActivityResult 包装在一个返回结果的函数中

标签 java android android-activity wait

我是 Android 新手,正在尝试创建身份验证函数,该函数将使用 startActivityForResult 和 onActivityResult 并返回结果(在我的例子中是两个字符串的数组 - 来自登录屏幕的用户名和密码)。

这是我的代码(用户名和密码返回 null)

在主 Activity 中(调用authenticate()函数):

public String user;
public String pass;

public void startAuth(Intent i)
{
    startActivityForResult(i, 1);
}

public String[] authenticate()
{
    String[] ret = new String[2];
    Intent i = new Intent(getApplicationContext(), LoginActivity.class);
    startAuth(i);

    ret[0] = i.getStringExtra("iUsername");
    ret[1] = i.getStringExtra("iPassword");

return ret;
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (data.getExtras().containsKey("iUsername"))
    {
        user = data.getStringExtra("iUsername");
        pass = data.getStringExtra("iPassword");
    }
}    

在登录 Activity 中:

public class LoginActivity extends Activity {

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

    Button loginButton = (Button) findViewById(R.id.btnLogin);
    final EditText username = (EditText) findViewById(R.id.username_fill);
    final EditText password = (EditText) findViewById(R.id.password_fill);

    // Listening to Login Button
    loginButton.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            Intent i = getIntent();
            i.putExtra("iUsername", username.getText().toString());
            i.putExtra("iPassword", password.getText().toString());

            setResult(RESULT_OK, i);
            finish();
        }
    });
    }
} 

我知道我需要以某种方式等待 onActivityResult 回调,但我尝试了不同的解决方案(使用 wait() 和 notification(),使用单例)但无法让它工作......

我必须包装它,而不是像这样使用它,因为我想在更大的代码中使用authenticate()函数。任何不使用上述功能的解决方案也可以..

谢谢!

最佳答案

无论您在哪里使用 authenticate()您实际上并不是在等待回复:

public void authenticate() // Changed return type to void
{
    //String[] ret = new String[2];
    Intent i = new Intent(getApplicationContext(), LoginActivity.class);
    startAuth(i);

    /*
     * This code does nothing, the Intent you want is in onActivityResult()

        ret[0] = i.getStringExtra("iUsername");
        ret[1] = i.getStringExtra("iPassword");
        return ret;
     */
}

你必须打破你的逻辑,以便当onActivityResult()时被称为它在 authenticate() 处恢复离开了。了解您无法在方法中间恢复。
所以你必须调用authenticate()在一种方法的末尾以及您使用 ret 的任何地方现在必须是从 onActivityResult() 调用的新方法.

关于java - 将 startActivityForResult 和 onActivityResult 包装在一个返回结果的函数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15552919/

相关文章:

java - 即使设置正确,Gradle 也会发现错误的 JAVA_HOME

java - 在 Java 正则表达式中包含注释

android - 设置安卓屏幕分辨率

java - 将字符串类型日期更改为日期字符串

android - 如何在android中实现中介广告

android - 在 Android 中查看 Activity 堆栈

java - 更改 Android 应用程序中按钮的背景颜色

java - while 循环和 substring() 导致 StringIndexOutOfBoundsException

java - 在我的(java spring mvc + mysql应用程序,thymeleaf)中实现spring security后,身份验证发生了一些奇怪的事情

android - 一项 Activity 中不同布局的按钮状态?