无法通过Android中的活动传递参数
我是android应用程序开发新手,当我通过活动传递参数时,我遇到以下问题。在我的应用程序中,用户输入他的电子邮件、用户名和密码,单击提交按钮,然后进入下一个活动(NewProfile.class),在该活动中,他的用户名应打印在文本视图中。但是,当用户正确填写所有字段并显示toast“Welcome to Allamoda”时,每个字段都变为红色(仅当用户输入错误时才会出现这种情况),然后返回MainActivity 注册类别代码:无法通过Android中的活动传递参数,android,Android,我是android应用程序开发新手,当我通过活动传递参数时,我遇到以下问题。在我的应用程序中,用户输入他的电子邮件、用户名和密码,单击提交按钮,然后进入下一个活动(NewProfile.class),在该活动中,他的用户名应打印在文本视图中。但是,当用户正确填写所有字段并显示toast“Welcome to Allamoda”时,每个字段都变为红色(仅当用户输入错误时才会出现这种情况),然后返回MainActivity 注册类别代码: package dmst.allamoda; import
package dmst.allamoda;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
public class Signup extends ActionBarActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_signup);
setupVariables();
}
private EditText email;
private EditText username;
private EditText password1;
private EditText password2;
public static String PUBLIC_STATIC_STRING_IDENTIFIER = "";
public void signupControl(View view) {
if ((email.getText().toString().trim().length() > 0) && (username.getText().toString().trim().length() > 0) && (password1.getText().toString().trim().length() > 0) &&
(password2.getText().toString().trim().length() > 0) && (password1.getText().toString().equals(password2.getText().toString()))) {
Toast.makeText(getApplicationContext(), "Welcome to AllaModa!",
Toast.LENGTH_SHORT).show();
Intent resultIntent = new Intent(this, NewProfile.class);
resultIntent.putExtra(PUBLIC_STATIC_STRING_IDENTIFIER, username.getText().toString());
setResult(NewProfile.RESULT_OK, resultIntent);
finish();
} else {
if (!(email.getText().toString().trim().length() > 0)) {
Toast.makeText(getApplicationContext(), " email!",
Toast.LENGTH_SHORT).show();
}
if (!(username.getText().toString().trim().length() > 0)) {
Toast.makeText(getApplicationContext(), " username!",
Toast.LENGTH_SHORT).show();
}
if (!(password1.getText().toString().trim().length() > 0)) {
Toast.makeText(getApplicationContext(), " password!",
Toast.LENGTH_SHORT).show();
}
if (!(password2.getText().toString().trim().length() > 0)) {
Toast.makeText(getApplicationContext(), " password!",
Toast.LENGTH_SHORT).show();
} else {
if (!(password1.getText().toString().equals(password2.getText().toString()))) {
Toast.makeText(getApplicationContext(), "passwords!",
Toast.LENGTH_SHORT).show();
}
}
}
email.setBackgroundColor(Color.parseColor("#F5CCCC"));
email.setTextColor(Color.parseColor("#B80000"));
username.setBackgroundColor(Color.parseColor("#F5CCCC"));
username.setTextColor(Color.parseColor("#B80000"));
password1.setBackgroundColor(Color.parseColor("#F5CCCC"));
password1.setTextColor(Color.parseColor("#B80000"));
password2.setBackgroundColor(Color.parseColor("#F5CCCC"));
password2.setTextColor(Color.parseColor("#B80000"));
}
private void setupVariables() {
email = (EditText) findViewById(R.id.signupEmail);
username = (EditText) findViewById(R.id.signupUsername);
password1 = (EditText) findViewById(R.id.signup1Password);
password2 = (EditText) findViewById(R.id.signup2Password);
}
}
Signup
未转换到NewProfile
活动。它正在返回到以前的活动(可能是,MainActivity
)
这是问题代码:
Intent resultIntent = new Intent(this, NewProfile.class);
resultIntent.putExtra(PUBLIC_STATIC_STRING_IDENTIFIER, username.getText().toString());
setResult(NewProfile.RESULT_OK, resultIntent);
finish();
大概,您想做如下操作:
Intent intent = new Intent(this, NewProfile.class);
intent.putExtra(PUBLIC_STATIC_STRING_IDENTIFIER, username.getText().toString());
startActivity(intent);
finish();
[已编辑]
finish()在更现代的设备中,末尾的code>语句应将注册
活动排除在历史堆栈之外。然而,对此答案的一些评论(@AndrewBreen和@Cookster)指出,在速度较慢的设备上这样做可能不起作用
如果您对此感到担忧,@Cookster的评论提供了一个可能的解决方案,可以避免调用finish()
:
我用来避免这种情况的模式是打开活动
登录活动以onActivityResult中的路由容量进行操作,即。
它检查登录状态,如果无效,则打开登录活动,
否则将执行需要验证状态的操作等
在活动a上试试这个
Intent i = new Intent(this, ActivityB.class);
i.putExtra("SomeKEY",YourData);
关于oncreate方法中的活动B
Bundle extras = getIntent().getExtras();
if(extras !=null)
if(extras !=null) {String value = extras.getString("KEY");}
我不清楚你的预期和实际结果是什么,你能在你的问题中更具体一些吗?我编辑了我的问题。现在清楚了吗?对不起,不,我还是不清楚。(1) 你想开始一项新的活动吗?或者(2)您是否试图返回MainActivity并想知道为什么每个字段都变成红色?关于#1,请参见下面cybersam的答案。对于#2,我们需要在MainActivity中查看代码。奇怪的是,我试图编辑它并删除“finish()”,但它做了其他事情。无论如何,启动新活动时最好不要调用finish()。这可能导致Signup.class在NewProfile出现之前退出。在转换之间,用户可能会看到后台堆栈上的任何内容闪烁。@Cookster当您要在转换到另一个活动时从历史堆栈中删除当前活动(如用于登录的活动)时,这是一种非常常见的编码模式。请提供证据,证明它可能导致您列出的问题,并在理想情况下,显示更好的解决方案。我曾经工作过,但现在不显示NewProfile.class中获取参数值的TextView。这是我在NewProfile.class@Override public void onActivityResult(int requestCode,int resultCode,Intent data){super.onActivityResult(requestCode,resultCode,data);switch(requestCode){case(1):{if(resultCode==NewProfile.RESULT\u OK){String newText=data.getStringExtra(public\u STATIC\u String\u标识符);TextView TextView=(TextView)findViewById(R.id.username);TextView.setTextSize(40);TextView.setText(newText);setContentView(TextView);}break;}}}}}}
onActivityResult()
仅在启动的活动返回到活动时调用。在本例中,NewProfile
没有启动另一个活动——它是正在启动的活动(通过Signup
)。您可能需要将最内层块中的逻辑移动到中。您应该学习活动生命周期的文档,或者参考一本好书安卓。@cybersam-在本场景中,活动a启动活动B,然后活动B完成并启动活动C。在本场景中,您创建了一个条件,在显示活动C之前,活动a可能进入视图。典型的流程是A->B->C,具有平滑的过渡。但是,通过显式调用finish(),您可能会打破将活动B留在前台而将活动C转换为视图的转换。正如上面用户所说,较慢的系统和较慢的硬件通常表现出这种行为。