无法检索文本字段的值

时间:2013-08-10 05:14:05

标签: java android android-layout android-intent android-emulator

我是Android开发中的新手。 我开发了一个包含登录的应用程序,必须在文本字段中传递凭据,然后它将调用web服务。 我面临的问题是用户和密码没有被复制到所需的位置。 请帮帮我。

    package com.authorwjf.http_get;

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class Main extends Activity implements OnClickListener {

    EditText txtUserName;
    EditText txtPassword;

    @Override
    public void onCreate(Bundle savedInstanceState) {
         txtUserName=(EditText)this.findViewById(R.id.editText1);
         txtPassword=(EditText)this.findViewById(R.id.editText2);

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        findViewById(R.id.my_button).setOnClickListener(this);
    }

    @Override
    public void onClick(View arg0) {
        Button b = (Button)findViewById(R.id.my_button);
        b.setClickable(false);
        new LongRunningGetIO().execute();
    }

    private class LongRunningGetIO extends AsyncTask <Void, Void, String> {

        protected String getASCIIContentFromEntity(HttpEntity entity) throws IllegalStateException, IOException {
           InputStream in = entity.getContent();
             StringBuffer out = new StringBuffer();
             int n = 1;
             while (n>0) {
                 byte[] b = new byte[4096];
                 n =  in.read(b);
                 if (n>0) out.append(new String(b, 0, n));
             }
             return out.toString();
        }

        @Override
        protected String doInBackground(Void... params) {
             HttpClient httpClient = new DefaultHttpClient();
             HttpContext localContext = new BasicHttpContext();

            String user= txtUserName.getText().toString();
            String pass= txtPassword.getText().toString();

            System.out.println("USERRRR"+user);
             System.out.println(pass);

             //String user="at@ril.com";
             //String pass= "123456";

            String accessTokenQry = "{"+
                      "\"uid\":\""+user+"\","+
                      "\"password\":\""+pass+"\","+
                      "\"consumptionDeviceId\":\"fder-et3w-3adw2-2erf\","+
                      "\"consumptionDeviceName\":\"Samsung Tab\""+
                    "}";

             HttpPost httpPost = new HttpPost("http://devssg01.ril.com:8080/v2/dip/auth/login");
             httpPost.setHeader("Content-Type",
                    "application/json");
            httpPost.setHeader("X-API-Key",
                    "l7xx7914b8704b2d4b029ab9c4b1b9c66dbf");
            StringEntity input;
            try {
                input = new StringEntity(accessTokenQry);
                httpPost.setEntity(input);
            } catch (UnsupportedEncodingException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }



             String text = null;
             try {
                   HttpResponse response = httpClient.execute(httpPost, localContext);
                   HttpEntity entity = response.getEntity();
                   text = getASCIIContentFromEntity(entity);
             } catch (Exception e) {
                 return e.getLocalizedMessage();
             }
             return text;
        }   

        protected void onPostExecute(String results) {
            if (results!=null) {
                EditText et = (EditText)findViewById(R.id.my_edit);
                et.setText(results);
            }
            Button b = (Button)findViewById(R.id.my_button);
            b.setClickable(true);
        }
    }
}

LogCat输出为:

08-10 01:20:23.977: W/dalvikvm(760): threadid=14: thread exiting with uncaught exception (group=0x414c4700)
08-10 01:20:23.984: E/AndroidRuntime(760): FATAL EXCEPTION: AsyncTask #4
08-10 01:20:23.984: E/AndroidRuntime(760): java.lang.RuntimeException: An error occured while executing doInBackground()
08-10 01:20:23.984: E/AndroidRuntime(760):  at android.os.AsyncTask$3.done(AsyncTask.java:299)
08-10 01:20:23.984: E/AndroidRuntime(760):  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
08-10 01:20:23.984: E/AndroidRuntime(760):  at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
08-10 01:20:23.984: E/AndroidRuntime(760):  at java.util.concurrent.FutureTask.run(FutureTask.java:239)
08-10 01:20:23.984: E/AndroidRuntime(760):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
08-10 01:20:23.984: E/AndroidRuntime(760):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
08-10 01:20:23.984: E/AndroidRuntime(760):  at java.lang.Thread.run(Thread.java:841)
08-10 01:20:23.984: E/AndroidRuntime(760): Caused by: java.lang.NullPointerException
08-10 01:20:23.984: E/AndroidRuntime(760):  at com.authorwjf.http_get.Main$LongRunningGetIO.doInBackground(Main.java:66)
08-10 01:20:23.984: E/AndroidRuntime(760):  at com.authorwjf.http_get.Main$LongRunningGetIO.doInBackground(Main.java:1)
08-10 01:20:23.984: E/AndroidRuntime(760):  at android.os.AsyncTask$2.call(AsyncTask.java:287)
08-10 01:20:23.984: E/AndroidRuntime(760):  at java.util.concurrent.FutureTask.run(FutureTask.java:234)
08-10 01:20:23.984: E/AndroidRuntime(760):  ... 3 more

5 个答案:

答案 0 :(得分:1)

您正尝试在加载布局之前初始化EditText

如果要在布局上获取EditText,则必须在加载布局后初始化它。

这是正确的代码:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        findViewById(R.id.my_button).setOnClickListener(this);

        txtUserName=(EditText)this.findViewById(R.id.editText1);
        txtPassword=(EditText)this.findViewById(R.id.editText2);
    }

答案 1 :(得分:1)

使用此

               EditText textw3d =(EditText) findViewById(R.id.editText3d);
                final String  strd3d = textw3d.getText().toString();

答案 2 :(得分:1)

我建议您在代码中进行更改。

只需写下以下行

super.onCreate(savedInstanceState); 的setContentView(R.layout.main);

上面

txtUserName =(EditText上)this.findViewById(R.id.editText1); txtPassword =(EditText上)this.findViewById(R.id.editText2);

答案 3 :(得分:1)

在setContentView函数调用之后移动您获取文本视图引用的行:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    findViewById(R.id.my_button).setOnClickListener(this);

    txtUserName=(EditText)this.findViewById(R.id.editText1);
    txtPassword=(EditText)this.findViewById(R.id.editText2);
}

事实上,您需要在初始化布局中的任何窗口小部件之前调用setContentView,因为这是将layout_main.xml文件中定义的布局“加载”到您的活动中的调用。

答案 4 :(得分:0)

非常感谢Guyz, 这个问题现在解决了。 特别感谢JustWork

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        findViewById(R.id.my_button).setOnClickListener(this);

        txtUserName=(EditText)this.findViewById(R.id.editText1);
        txtPassword=(EditText)this.findViewById(R.id.editText2);
    }