Java 在Android中将EditText输入从一个类传递到另一个类
我看到了更多类似的问题,但没有设法理解它们,或者它们不适用于我的问题,所以这里开始 我有一个活动,允许您登录,另一个活动允许您使用登录凭据发送帖子和获取请求,等等 主要活动:Java 在Android中将EditText输入从一个类传递到另一个类,java,android,Java,Android,我看到了更多类似的问题,但没有设法理解它们,或者它们不适用于我的问题,所以这里开始 我有一个活动,允许您登录,另一个活动允许您使用登录凭据发送帖子和获取请求,等等 主要活动: public class MainActivity extends Activity { private String username; private String password; @Override protected void onCreate(Bundle savedIns
public class MainActivity extends Activity
{
private String username;
private String password;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText usernameField = (EditText) findViewById(R.id.enterUsername);
final EditText passwordField = (EditText) findViewById(R.id.enterPassword);
Button startButton = (Button) findViewById(R.id.startButton);
startButton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View view)
{
username = usernameField.getText().toString();
password = passwordField.getText().toString();
Intent myIntent = new Intent(view.getContext(), HttpGetPost.class);
startActivityForResult(myIntent, 0);
}
});
}
public String getUser() { return this.username; }
public String getPassword() { return this.password; }
}
Intent myIntent = new Intent(this, HttpGetPost.class);
myIntent.putExtra("username", username);
myIntent.putExtra("password", password);
startActivity(myIntent);
HttpGetPost:
public class HttpGetPost extends Activity
{
private MainActivity mainProxy = new MainActivity();
private Button postButton;
private Button getButton;
private Button getMeasureButton;
private Button getDevicesButton;
private String access_token;
private String refresh_token;
private String device_list;
private String expires_in;
private String getRequest;
private static final String TAG = "MyActivity";
private static final String USER_AGENT = "Mozilla/5.0";
private String clientID = some_id;
private String clientSecret = some_secret;
private String user = mainProxy.getUser();
private String pass = mainProxy.getPassword();
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_http);
Log.v(TAG, "mainProxy.username: "+user);
Log.v(TAG, "mainProxy.password: "+pass);
postButton = (Button) findViewById(R.id.postButton);
postButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
new sendPost().execute("");
}
});
}
private class sendPost extends AsyncTask<String, Void, String>
{
@Override
protected String doInBackground(String... params)
{
try
{
String url = some_url;
URL obj = new URL(url);
HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();
//add request header
con.setRequestMethod("POST");
con.setRequestProperty("User-Agent", USER_AGENT);
con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
String urlParameters = "grant_type=password&client_id=" +clientID +"&client_secret="
+clientSecret +"&username=" +user +"&password=" +pass;
// Send post request
con.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.writeBytes(urlParameters);
wr.flush();
wr.close();
int responseCode = con.getResponseCode();
Log.v(TAG, "\nSending 'POST' request to URL : " + url);
Log.v(TAG, "Post parameters : " + urlParameters);
Log.v(TAG, "Response Code : " + responseCode);
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
//print result
Log.v(TAG, response.toString());
if (responseCode == 200)
{
access_token = response.substring(17, 74);
refresh_token = response.substring(93,150);
expires_in = response.substring(165, 170);
getRequest = "http://api.netatmo.net/api/getuser?access_token=" +access_token + " HTTP/1.1";
Log.v(TAG, "access token: " +access_token);
Log.v(TAG, "refresh token: " +refresh_token);
Log.v(TAG, "expires in: " +expires_in);
}
}
catch(Exception e){
e.printStackTrace();
}
return "";
}
protected void onPostExecute(String result) {
Toast.makeText(getApplicationContext(), "ENDED", Toast.LENGTH_LONG).show();
}
}
}
当我在第二个类中打印用户名和密码时,它们都返回null,POST请求失败。您应该使用以下putExtra方法将用户名和密码传递给您的活动:
Intent myIntent = new Intent(view.getContext(), HttpGetPost.class);
myIntent.putExtra("username", username);
myIntent.putExtra("password", pasword);
startActivityForResult(myIntent, 0);
在第二个活动中,例如在onCreate after setContentView中,可以使用getXXExtras检索它们:
Intent intent = getIntent();
String username = intent.getStringExtra("username");
String password = intent.getStringExtra("password");
您应该使用以下方法将用户名和密码传递给您的活动:
Intent myIntent = new Intent(view.getContext(), HttpGetPost.class);
myIntent.putExtra("username", username);
myIntent.putExtra("password", pasword);
startActivityForResult(myIntent, 0);
在第二个活动中,例如在onCreate after setContentView中,可以使用getXXExtras检索它们:
Intent intent = getIntent();
String username = intent.getStringExtra("username");
String password = intent.getStringExtra("password");
尝试使用附加功能:
Intent myIntent = new Intent(view.getContext(), HttpGetPost.class);
myIntent.putExtra("username", username);
myIntent.putExtra("password", password);
startActivityForResult(myIntent, 0);
在另一个ActvityYourHttpGetPost中
String user = getIntent().getStringExtra("username");
String password = getIntent().getStringExtra("password");
尝试使用附加功能:
Intent myIntent = new Intent(view.getContext(), HttpGetPost.class);
myIntent.putExtra("username", username);
myIntent.putExtra("password", password);
startActivityForResult(myIntent, 0);
在另一个ActvityYourHttpGetPost中
String user = getIntent().getStringExtra("username");
String password = getIntent().getStringExtra("password");
下面是一个关于正确使用意图的好例子
尝试调用HttpGetPost活动:
Intent myIntent = new Intent(this, HttpGetPost.class);
myIntent.putExtra("username", username);
myIntent.putExtra("password", password);
startActivity(myIntent);
这样,您就可以在Intent构造函数中传递正确的上下文。将数据放入要发送到活动的目的中。下一点是不要调用startActivityForResult,它用于调用活动、进行一些计算并将结果发送回请求活动
现在,在onCreate中像这样从HttpGetPost活动的意图中获取数据,并将其保存到字段:
getIntent().getExtras().getString("username");
getIntent().getExtras().getString("password");
下面是一个关于正确使用意图的好例子
尝试调用HttpGetPost活动:
Intent myIntent = new Intent(this, HttpGetPost.class);
myIntent.putExtra("username", username);
myIntent.putExtra("password", password);
startActivity(myIntent);
这样,您就可以在Intent构造函数中传递正确的上下文。将数据放入要发送到活动的目的中。下一点是不要调用startActivityForResult,它用于调用活动、进行一些计算并将结果发送回请求活动
现在,在onCreate中像这样从HttpGetPost活动的意图中获取数据,并将其保存到字段:
getIntent().getExtras().getString("username");
getIntent().getExtras().getString("password");
你不需要
private MainActivity mainProxy = new MainActivity();
在HttpGetPost中。它将创建一个新的MainActivity,它不是启动HttpGetPost的原始MainActivity
您可以使用extras跨意图发送数据。以下是我的解决方案:
把这个放在主活动中
Intent myIntent = new Intent(view.getContext(), HttpGetPost.class);
myIntent.putExtra(HttpGetPost.KEY_USERNAME, username);
myIntent.putExtra(HttpGetPost.KEY_PASSWORD, password);
startActivityForResult(myIntent, 0);
这是针对HttpGetPost的,可以使用KEY_用户名和KEY_密码来存储额外的密钥,这样可以避免输入错误
public static final String KEY_USERNAME = "username"; // or whatever you like for key
public static final String KEY_PASSWORD = "password"; // or whatever you like for key
private String user; // instead of private String user = mainProxy.getUser();
private String pass; // instead of private String pass = mainProxy.getPassword();
将其放在HttpGetPost的onCreate中,以从intent获取数据
Intent intent = getIntent();
user = intent.getStringExtra(KEY_USERNAME);
pass = intent.getStringExtra(KEY_PASSWORD);
是正式的意向文件。您不需要
private MainActivity mainProxy = new MainActivity();
在HttpGetPost中。它将创建一个新的MainActivity,它不是启动HttpGetPost的原始MainActivity
您可以使用extras跨意图发送数据。以下是我的解决方案:
把这个放在主活动中
Intent myIntent = new Intent(view.getContext(), HttpGetPost.class);
myIntent.putExtra(HttpGetPost.KEY_USERNAME, username);
myIntent.putExtra(HttpGetPost.KEY_PASSWORD, password);
startActivityForResult(myIntent, 0);
这是针对HttpGetPost的,可以使用KEY_用户名和KEY_密码来存储额外的密钥,这样可以避免输入错误
public static final String KEY_USERNAME = "username"; // or whatever you like for key
public static final String KEY_PASSWORD = "password"; // or whatever you like for key
private String user; // instead of private String user = mainProxy.getUser();
private String pass; // instead of private String pass = mainProxy.getPassword();
将其放在HttpGetPost的onCreate中,以从intent获取数据
Intent intent = getIntent();
user = intent.getStringExtra(KEY_USERNAME);
pass = intent.getStringExtra(KEY_PASSWORD);
是意图的官方文件。为了澄清我在jbihan回答的评论中的意思: 我正在更新您的代码: 第一次修订:
Button startButton = (Button) findViewById(R.id.startButton);
startButton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View view)
{
username = usernameField.getText().toString();
password = passwordField.getText().toString();
Intent myIntent = new Intent(view.getContext(), HttpGetPost.class);
// ADDITION
myIntent.putExtra("username", username);
myIntent.putExtra("password", password);
// END ADDITION
startActivityForResult(myIntent, 0);
}
});
postButton = (Button) findViewById(R.id.postButton);
// ADDITION
final String user = getIntent().getStringExtra("username");
final String password = getIntent().getStringExtra("password");
// END ADDITION
postButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
// EDITED
new sendPost().execute(user, password);
}
});
private class sendPost extends AsyncTask<String, Void, String>
{
@Override
protected String doInBackground(String... params)
{
// ADDITION
String user = params[0];
String password = params[1];
// END ADDITION
// use them in the request
// rest of code...
}
}
第二次修订:
Button startButton = (Button) findViewById(R.id.startButton);
startButton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View view)
{
username = usernameField.getText().toString();
password = passwordField.getText().toString();
Intent myIntent = new Intent(view.getContext(), HttpGetPost.class);
// ADDITION
myIntent.putExtra("username", username);
myIntent.putExtra("password", password);
// END ADDITION
startActivityForResult(myIntent, 0);
}
});
postButton = (Button) findViewById(R.id.postButton);
// ADDITION
final String user = getIntent().getStringExtra("username");
final String password = getIntent().getStringExtra("password");
// END ADDITION
postButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
// EDITED
new sendPost().execute(user, password);
}
});
private class sendPost extends AsyncTask<String, Void, String>
{
@Override
protected String doInBackground(String... params)
{
// ADDITION
String user = params[0];
String password = params[1];
// END ADDITION
// use them in the request
// rest of code...
}
}
第三次修订:
Button startButton = (Button) findViewById(R.id.startButton);
startButton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View view)
{
username = usernameField.getText().toString();
password = passwordField.getText().toString();
Intent myIntent = new Intent(view.getContext(), HttpGetPost.class);
// ADDITION
myIntent.putExtra("username", username);
myIntent.putExtra("password", password);
// END ADDITION
startActivityForResult(myIntent, 0);
}
});
postButton = (Button) findViewById(R.id.postButton);
// ADDITION
final String user = getIntent().getStringExtra("username");
final String password = getIntent().getStringExtra("password");
// END ADDITION
postButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
// EDITED
new sendPost().execute(user, password);
}
});
private class sendPost extends AsyncTask<String, Void, String>
{
@Override
protected String doInBackground(String... params)
{
// ADDITION
String user = params[0];
String password = params[1];
// END ADDITION
// use them in the request
// rest of code...
}
}
请考虑使用用户名和密码键的常量。
< P>以澄清JBIHAN的回答中的意思: 我正在更新您的代码: 第一次修订:Button startButton = (Button) findViewById(R.id.startButton);
startButton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View view)
{
username = usernameField.getText().toString();
password = passwordField.getText().toString();
Intent myIntent = new Intent(view.getContext(), HttpGetPost.class);
// ADDITION
myIntent.putExtra("username", username);
myIntent.putExtra("password", password);
// END ADDITION
startActivityForResult(myIntent, 0);
}
});
postButton = (Button) findViewById(R.id.postButton);
// ADDITION
final String user = getIntent().getStringExtra("username");
final String password = getIntent().getStringExtra("password");
// END ADDITION
postButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
// EDITED
new sendPost().execute(user, password);
}
});
private class sendPost extends AsyncTask<String, Void, String>
{
@Override
protected String doInBackground(String... params)
{
// ADDITION
String user = params[0];
String password = params[1];
// END ADDITION
// use them in the request
// rest of code...
}
}
第二次修订:
Button startButton = (Button) findViewById(R.id.startButton);
startButton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View view)
{
username = usernameField.getText().toString();
password = passwordField.getText().toString();
Intent myIntent = new Intent(view.getContext(), HttpGetPost.class);
// ADDITION
myIntent.putExtra("username", username);
myIntent.putExtra("password", password);
// END ADDITION
startActivityForResult(myIntent, 0);
}
});
postButton = (Button) findViewById(R.id.postButton);
// ADDITION
final String user = getIntent().getStringExtra("username");
final String password = getIntent().getStringExtra("password");
// END ADDITION
postButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
// EDITED
new sendPost().execute(user, password);
}
});
private class sendPost extends AsyncTask<String, Void, String>
{
@Override
protected String doInBackground(String... params)
{
// ADDITION
String user = params[0];
String password = params[1];
// END ADDITION
// use them in the request
// rest of code...
}
}
第三次修订:
Button startButton = (Button) findViewById(R.id.startButton);
startButton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View view)
{
username = usernameField.getText().toString();
password = passwordField.getText().toString();
Intent myIntent = new Intent(view.getContext(), HttpGetPost.class);
// ADDITION
myIntent.putExtra("username", username);
myIntent.putExtra("password", password);
// END ADDITION
startActivityForResult(myIntent, 0);
}
});
postButton = (Button) findViewById(R.id.postButton);
// ADDITION
final String user = getIntent().getStringExtra("username");
final String password = getIntent().getStringExtra("password");
// END ADDITION
postButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
// EDITED
new sendPost().execute(user, password);
}
});
private class sendPost extends AsyncTask<String, Void, String>
{
@Override
protected String doInBackground(String... params)
{
// ADDITION
String user = params[0];
String password = params[1];
// END ADDITION
// use them in the request
// rest of code...
}
}
请考虑使用用户名和密码键的常量。
可以尝试将用户名和密码放入数组中。然后,当您开始HttpGetPost活动时,您可以将该数组作为额外的数组放置在intent中。这就是一个例子。您也可以查看文档。您可以尝试将用户名和密码放入数组中。然后,当您开始HttpGetPost活动时,您可以将该数组作为额外的数组放置在intent中。这就是一个例子。您还可以查看文档。HttpGetPost类中的doInBackground无法看到用户名和密码这两个字符串,因为它们在onCreate方法中。回答得好,不过最好使用在两个类中都可见的静态常量作为getXXXExtra方法的键,而不是字符串文本。此外,在分配变量之前,您还可以使用hasExtra方法检查这些值是否确实存在于intent中,以防止出现潜在的空指针异常。@OddCore只需在onCreate方法中获取这些值,并将它们作为参数发送到AsyncTask:new sendPost.executeuser,pass@ItaiHanski我从sendPost类的doInBackground中访问用户并传递变量,因此它不允许我执行新的sendPost.executeuser,pass@OddCore我创建了一个答案来详细说明我的意思,看一看。HttpGetPost类中的doInBackground看不到用户名和密码这两个字符串,因为它们在onCreate方法中。答案很好,但更好actice使用在两个类中都可见的静态常量作为getXXXExtra方法的键,而不是字符串文本。此外,在分配变量之前,您还可以使用hasExtra方法检查这些值是否确实存在于intent中,以防止出现潜在的空指针异常。@OddCore只需在onCreate方法中获取这些值,并将它们作为参数发送到AsyncTask:new sendPost.executeuser,pass@ItaiHanski我从sendPost类的doInBackground中访问用户并传递变量,因此它不允许我执行新的sendPost.executeuser,pass@OddCore我创建了一个答案来阐述我的意思,看一看。谢谢你的回答,你帮助我理解了问题:谢谢你的回答,你帮助我理解了问题:谢谢你的回答,你帮助我理解了问题:谢谢你的回答,你帮助我理解了问题: