在活动之间传递字符串,意图不起作用



我目前正在与一个朋友一起从事一个项目,在那里我们有一个网站托管登录详细信息等。当用户登录时,它将返回一个令牌返回该应用程序,用作用户进一步呼叫的验证。(即获取个人资料)。我需要在其他活动中传递此令牌(这是一个字符串),然后我尝试使用意图,但是每次尝试使用nullPointerException时,我称之为的班级找不到。我要发送的额外。我已经尝试将代码用于在onCreate方法的顶部创建意图的代码,但是(我假设)令牌没有值,因为它没有使用JSONOBJECT请求,因为它尚未由服务器发送,因为该代码没有值然而。这是主要活动的代码(删除了所有链接)(我还没有包括所有导入和可变声明,因为我认为它们是不必要的)

    String Name,Pass,tokenString;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    button = (Button) findViewById(R.id.button);
    token = (TextView) findViewById(R.id.TV1);
    name = (EditText) findViewById(R.id.name);
    pass = (EditText) findViewById(R.id.pass);
    register = (Button) findViewById(R.id.button2);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          Name = name.getText().toString();
            Pass = pass.getText().toString();

            if(Name.equals("") || Pass.equals("")){
                Toast.makeText(MainActivity.this, "Fields cannot be left empty!", Toast.LENGTH_SHORT).show();
            }
            StringRequest stringRequest = new StringRequest(Request.Method.POST, Url, new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    try {
                        JSONObject jsonObject =  new JSONObject(response);
                        setToken(jsonObject.getString("token"));
                        launchHomeActivity();
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    if(error.networkResponse.statusCode==401) {
                        Toast.makeText(MainActivity.this, "Incorrect login details, please retry", Toast.LENGTH_SHORT).show();
                    }
                }
            }){
                protected Map<String,String> getParams() throws AuthFailureError{
                    Map<String,String> params = new HashMap<String, String>();
                    params.put("key", "****");
                    params.put("email", Name);
                    params.put("password", Pass);
                    return params;
                }
            };
            MySingleton.getInstance(MainActivity.this).addToRequestQueue(stringRequest);
            name.setText("");
            pass.setText("");
        }
    });
    register.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            launchRegisterActivity();
        }
    });
}
private void launchRegisterActivity() {
    Intent intent = new Intent(this, RegisterActivity.class);
    startActivity(intent);
}
private void launchHomeActivity() {

    Intent intent = new Intent(this, Home.class);
    startActivity(intent);
}
private void setToken(String token){
    tokenString = token;
}
public String getToken(){
    return tokenString;
}
public void createIntent(){
    Intent i = new Intent(this, Home.class);
    i.putExtra("Token", getToken());
    startActivity(i);
}
}

这是家庭活动的代码(相关位):

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    token = (TextView) findViewById(R.id.TV1) ;
    title = (TextView) findViewById(R.id.welcome_Txt);

    Bundle extras = getIntent().getExtras();
   final String tokenString = extras.getString("Token");


            StringRequest stringRequest = new StringRequest(Request.Method.GET, ProfileUrl, new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    try {
                        // JSONArray jsonArray = new JSONArray(response);
                        JSONObject jsonObject =  new JSONObject(response);
                         title.setText("Welcome back " +  jsonObject.getString("token") + "!");

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                }
            }){
                protected Map<String,String> getParams() throws AuthFailureError{
                    Map<String,String> params = new HashMap<String, String>();
                    params.put("key", "****");
                    params.put("Token", tokenString);
                    return params;
                }
            };
            MySingleton.getInstance(Home.this).addToRequestQueue(stringRequest);

        }

任何帮助都非常感谢。
(P.S,我是Android Studio的新手,并且我去学习)

从服务器获得响应后,您仅调用启动性化方法。但是您仅在"创建"方法中设置数据。我认为这是问题。我已经编辑了启动性化方法。

    private void launchHomeActivity() {

     Intent intent = new Intent(this, Home.class);
    intent .putExtra("Token", getToken());
    startActivity(intent);
  }

您在OnResponse()accessToken上获得响应后正在调用launchHomeActivity()。但是您将token存储在createIntent()上,该CC_7从未被调用。因此,在获得token之后,请在OnResponse()方法上调用createIntent()

这不是将令牌从Activity传递到Activity的最佳实践。更好的是将token存储在SharedPrefrence上,并从任何Wherer中访问它。做一个单顿SharedPreference类,您可以在整个应用程序上使用它。

调用活动时您没有添加捆绑包(Extras)例如

Intent intent = new Intent(this, Home.class);
intent.putExtra("Token", "XXX-YYY-ZZZ");  //Imp
startActivity(intent);

尝试这样做..

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
token = (TextView) findViewById(R.id.TV1) ;
title = (TextView) findViewById(R.id.welcome_Txt);

String extras = getIntent().getStringExtra("Token);

,但我建议您更好地将其保存在共享的偏好中,并在您的所有活动中使用。

例如:

用于偏好设置值:

 SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_NAME, 
 MODE_PRIVATE).edit();
 editor.putString("Token", getToken);
 editor.apply();

用于从首选中检索数据:

 SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME, 
 MODE_PRIVATE); 
 String restoredText = prefs.getString("text", null);
 if (restoredText != null) {
 String name = prefs.getString("Token", "No name defined");//"No name 
 defined" 
 is the default value.
 }

您使用两个不同的意图来调用相同的active.class文件。仅使用两种不同的使用1意图,而仅将数据放在该意图上。不需要两个不同的意图来打电话回家。级活动。

private void launchHomeActivity() {
Intent intent = new Intent(this, Home.class);
startActivity(intent);}
public void createIntent(){
Intent i = new Intent(this, Home.class);
i.putExtra("Token", getToken());
startActivity(i);}

尝试这样。

Intent i = new Intent(this, Home.class);
i.putExtra("Token", getToken());
startActivity(i)
and on your Home activity get data like below code.
 Intent intent=getIntent();
 String token=intent.getStringExtra("token");

最新更新