【问题标题】:java.lang.NullPointerException when I'm trying to make button invisiblejava.lang.NullPointerException 当我试图使按钮不可见时
【发布时间】:2014-10-10 13:23:40
【问题描述】:

这个方法很好用。

public void onClick(View view) { 
btn = (Button) findViewById(R.id.trytogetin);
progr = (ProgressBar) findViewById(R.id.progressBar);
btn.setVisibility(View.INVISIBLE);
progr.setVisibility(View.VISIBLE);
EditText login = (EditText) findViewById(R.id.loginfld);
EditText passw = (EditText) findViewById(R.id.passfld);
String logincmd = "CheckLogin*" + login.getText() + "*" + passw.getText() + "*";
ss.senddata(logincmd, 1);
}

在这个方法中出现java.lang.NullPointerException (on btn.setVisibility(View.VISIBLE);

    public void geturdata(String answer) {
    if (answer != null)
    {
        System.out.println("true");
         btn.setVisibility(View.VISIBLE);
    }
    else
    {
        System.out.println("false");
    }
}

请告诉我如何在这种方法中调用按钮?我也不能在这个方法中使用 StartActivity(intent)。(同样的错误)。两种方法都放在一个活动中。

这是完整的代码 这是活动

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.content.Intent;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;


public class Login extends Activity {

SocketServer ss = new SocketServer();
Button btn;
ProgressBar progr;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    btn = (Button) findViewById(R.id.trytogetin);
    progr = (ProgressBar) findViewById(R.id.progressBar);
    try {
        ss.setserver();
    } catch (Exception ex) {
        System.out.println("------- " + ex);
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    menu.add("menu1");
    getMenuInflater().inflate(R.menu.login, menu);
    return true;

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
 }

 public void onClick(View view) {

    btn.setVisibility(View.INVISIBLE);
    progr.setVisibility(View.VISIBLE);
    EditText login = (EditText) findViewById(R.id.loginfld);
    EditText passw = (EditText) findViewById(R.id.passfld);
    String logincmd = "CheckLogin*" + login.getText() + "*" + passw.getText() + "*";
    ss.senddata(logincmd, 1);
 }

    public void geturdata(String answer) {
    if (answer != null)
    {
        System.out.println("true");
        btn.setVisibility(View.VISIBLE);
    }
    else
    {
        System.out.println("false");
    }
}
}

这是调用>geturdata的类

import android.os.Looper;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class SocketServer {

private Socket socket;
private static final int SERVERPORT = 11000;
private static String SERVER_IP = "192.168.2.222";
String answer;
private static String cmdtext;
private static int caller;

class ClientThread implements Runnable
{
   public void run() {
       if (cmdtext.equals("setserver"))
       {
           try
           {
               InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
               socket = new Socket(serverAddr, SERVERPORT);
           }
           catch (Exception ex)
           {System.out.println(ex);}
       }

       else {
           try {
               String str = cmdtext;
               PrintWriter out = new PrintWriter(new BufferedWriter(new       OutputStreamWriter(socket.getOutputStream())), true);
               out.println(str);
               out.flush();
               byte[] data = new byte[256];  
               InputStream inp = socket.getInputStream();
               inp.read(data);
               answer = new String(data, "UTF-8");
                                  Looper.prepare();
               handledata(answer);
               Looper.loop();
           } catch (UnknownHostException e) {
               e.printStackTrace();
           } catch (IOException e) {
               e.printStackTrace();
           } catch (Exception e) {
               e.printStackTrace();
           }
       }
    }
}
////////////////////////////////////////
public void setserver ()
{
   new Thread(new ClientThread()).start();
   cmdtext = "setserver";
}

private void handledata(String answer)  
{
    switch (caller) {
        case 1:
        {
            Login lgn = new Login();
            lgn.geturdata(answer);
        }
    }

}

public void senddata(String cmd, int callerid) 
{
this.cmdtext = cmd;
this.caller = callerid;
new Thread(new ClientThread()).start();
}
}

【问题讨论】:

  • geturdata 是从哪里调用的?

标签: android button android-activity nullpointerexception


【解决方案1】:

btnnull,当您调用 geturdata() 时。你应该在public void onCreate(Bundle b)中的setContentView(R.layout.activity_main);之后直接调用btn = (Button) findViewById(R.id.trytogetin);

private Button btn;  

public void onCreate(Bundle b) {
    super.onCreate(b);
    setContentView(R.layout.activity_main);
    btn = (Button)findViewById(R.id.trytogetin);
    ...
}

编辑:

但是,现在看到您的代码,这不是问题所在。这里有两个问题

        Login lgn = new Login();
        lgn.geturdata(answer);

您尝试实例化Activity。您应该通过意图启动活动,以便它们在正常的活动生命周期中实例化:通过onCreate

但还有更多:您尝试从另一个Thread 设置Button,而不是创建Button(UI 线程)的那个

您可以尝试从线程中的上下文获取句柄,并调用context.runOnUiThread(Runnable)。这样您就可以从其他线程更新 UI。

所以NPE是由于你实例化Login(必须由Android完成),并调用一个方法,但没有ContentView膨胀,所以无论如何都找不到Button, findViewById 返回 null

【讨论】:

  • 我是 android 编程的真正菜鸟。我明白我的错,明白我应该怎么做。但是我找不到任何关于如何从非活动类调用活动的真实示例。请逐步解释我该怎么做。提前谢谢你。
【解决方案2】:

您正在点击方法中获取按钮的 ID。所以要解决这个问题,请在 oncreate() 方法中获取您的按钮 ID。因此,您可以在任何地方访问按钮。但是全局声明按钮

【讨论】:

    【解决方案3】:

    在 OnCreate() 中声明

    btn = (Button) findViewById(R.id.trytogetin); 
    

    progr = (ProgressBar) findViewById(R.id.progressBar);

    public void onClick(View view) { 
    btn.setVisibility(View.INVISIBLE);
     progr.setVisibility(View.VISIBLE);
       }
      String logincmd = "CheckLogin*" + login.getText().toString() + "*" + passw.getText().toString() + "*";
    

    所以在你使用Button btn对象的地方引用这个方法geturdata返回null,因为你在onClick按钮内部使用了。

     public void geturdata(String answer) {
    

    【讨论】:

    • 仍然出现同样的错误。按钮和进度条声明。但是第一种方法可以看到,第二种方法看不到
    • 在 onCreate 中也声明这一点。 EditText login = (EditText) findViewById(R.id.loginfld); EditText passw = (EditText) findViewById(R.id.passfld);使 EditText 全局 decalration 你如何为按钮完成。
    • 更正这一行 String logincmd = "CheckLogin*" + login.getText().toString() + "" + passw.getText().toString() + " "; @TorquxWhiskas
    猜你喜欢
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    相关资源
    最近更新 更多