我是 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/