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

时间:2017-12-06 12:56:11

标签: android android-intent

我目前正与一位朋友合作开展一个项目,我们有一个网站托管登录详情等。当用户登录时,它会向应用程序返回一个令牌,用于验证用户进一步的api调用。 (即获取个人资料)。我需要将这个令牌传递给其他活动(它是一个字符串),我试图使用意图,但每次我尝试它都会出现一个nullPointerException,其中我会调用意图从无法找到额外的i发送。我已经尝试将用于创建intent的代码放在onCreate方法的顶部,但是这会从服务器返回401 errors,因为(我假设)令牌没有值,因为它没有&# 39;已由服务器使用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工作室来说很新,并且像我一样学习)

6 个答案:

答案 0 :(得分:4)

从服务器获得响应后,您只调用launchHomeActivity方法。但是你在&#34; createIntent&#34;中设置数据;方法而已。我认为这是问题所在。我编辑了launchHomeActivity方法。

    private void launchHomeActivity() {


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

答案 1 :(得分:1)

尝试这样做..

@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.

 }

答案 2 :(得分:1)

您在launchHomeActivity()OnResponse()收到回复后致电accessToken。但是您将token存储在createIntent()上,而createIntent()从未被调用过。在获得OnResponse()后,请在token方法上致电Activity

将令牌从Activity传递到token并非最佳做法。最好将SharedPrefrence存储在SharedPreference上并从任何地方访问它。创建一个单独的 public function register(Request $request) { $this->validation($request); User::create([ 'name' => $request->name, 'lastname' => $request->lastname, 'email' => $request->email, 'password' => bcrypt($request->password) ]); $user->attachRole($employer); Auth::attempt([ 'email' =>$request->email, 'password' => $request->password]); // Authentication passed... return redirect('/'); } 类,您可以在整个应用程序中使用它。

答案 3 :(得分:0)

调用活动时,您没有添加bundle(extras) 例如

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

答案 4 :(得分:0)

您使用两种不同的意图来调用相同的activity.class文件。 使用两个不同的使用仅使用1个意图,并仅将数据放入该Intent。 不需要两个不同的目的来呼叫家庭活动。

.ssh

答案 5 :(得分:0)

尝试这样。

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");