"null" EditText 在 Android Studio 中应用于 URL 末尾时出错

Error with "null" EditText applying to end of URL in Android Studio

所以每次我 运行 应用程序,输入一个 ID 并点击提交;最终结果以 null 作为 ID。

例如:我想输入 12345 它应该转到 http://www.hiddenlink.com/12345 but instead it goes to http://www.hiddenlink.com/null

这是我的代码:

public class SearchActivity extends Activity {
Button btnSearchStudent;
String studentID;
private String url = "http://www.hiddenlink.com/" + studentID; // This is test SID just to confirm connection
private static final String TAG_ALLRECORDS = "Objects";
private static final String TAG_ENAME = "emer_name1";
private static final String TAG_EPHONE1 = "emer_Phone1";
private static final String TAG_EPHONE2 = "emer_Phone2";


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search);
    EditText txtStudentID = (EditText) findViewById(R.id.txtStudentID);
    studentID = txtStudentID.getText().toString();
    btnSearchStudent = (Button) findViewById(R.id.btnSearchSID);
    btnSearchStudent.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(SearchActivity.this, SearchResults.class);
            startActivity(intent);
            new JSONParse().execute();
        }

    });
}

private class JSONParse extends AsyncTask<Void, Void, Void> {
    private ProgressDialog pDialog;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        pDialog = new ProgressDialog(SearchActivity.this);
        pDialog.setMessage("Connection Test: Logging into Student Database...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
    }

    // Login to APIs
    @Override
    protected Void doInBackground(Void... args) {

        String _username = "hidden";
        String _password = "hidden123";
        String content = MyHttpURLConnection.getData(url, _username, _password);
        try {
// Getting JSON Object from URL Content
            JSONObject json = new JSONObject(content);
            JSONArray jsonArray = json.getJSONArray(TAG_ALLRECORDS);
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject c = jsonArray.getJSONObject(i);
// Storing JSON item in a Variable
                String emer_name1 = c.getString(TAG_ENAME);
                String emer_Phone1 = c.getString(TAG_EPHONE1);
                String emer_Phone2 = c.getString(TAG_EPHONE2);
// Adding value HashMap key => value
                HashMap<String, String> add = new HashMap<String, String>();
                add.put(TAG_EPHONE1, emer_Phone1);
                add.put(TAG_ENAME, emer_name1);
                add.put(TAG_EPHONE2, emer_Phone2);
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }
}
}
String studentID;
private String url = "http://www.hiddenlink.com/" + studentID;

studentID这里还没有初始化,所以它的值为null。删除 + studentID 部分并在设置值后添加 studentID

@Emd4600 说得对

只有在初始化 edittext 并且其中有一些值后,您才必须添加该值...

为此,只需定义 "url" 变量,但不要向其添加学生 ID:

private String url = "http://www.hiddenlink.com/%s";

稍后当你得到 edittext 时,将 id 添加到 url:

EditText txtStudentID = (EditText) findViewById(R.id.txtStudentID);

[... more code...]

String realUrl = String.format(url, txtStudentID.getText().toString(););

就是这样。

单击按钮后不会重新分配学生 ID,因此由于其基本初始化,它保持为空:

btnSearchStudent.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            // re-init the student id field
            CharSequence input = txtStudentId.getText();
            if (input  != null) {
                 studentID = input.toString();
            }
            Intent intent = new Intent(SearchActivity.this, SearchResults.class);
            startActivity(intent);
            new JSONParse().execute();
        }

    });

代码标准

您还应该将全局变量标记为 m<Name> 这是表示该字段是 class 成员变量的标准

推荐

另一种方法是将字符串传递给 AsyncTask 的 execute() 方法,这样您就可以传递多个参数而不是一个,但这需要您将 AsyncTask 更改为处理多个查询。

为什么不直接更改代码:

private String baseUrl = "http://www.hiddenlink.com/";
private String url = "";

btnSearchStudent.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        url = baseUrl + txtStudentID.getText().toString();
        new JSONParse().execute();
    }
});

我缺少重新定位整个的感觉Activity

正如 Emd4600 所写,您的 String studentID 目前尚未初始化。您可能希望在用户点击 btnSearchStudent 时构建并 运行 您的请求。为此,您必须在按钮的 onClick 侦听器中附加 txtStudentId 的内容。

我使用了 Filnik 所说的并且有效。 感谢所有输入的人,非常感谢。

菲尔尼克:

private String baseUrl = "http://www.hiddenlink.com/";
private String url = "";

 btnSearchStudent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
    url = baseUrl + txtStudentID.getText().toString();
    new JSONParse().execute();
}
 });