【问题标题】:How to change text on a Textview如何更改 Textview 上的文本
【发布时间】:2011-02-18 00:20:17
【问题描述】:

晚上 :)

我有个小问题……

正如您在下面的代码中看到的,我尝试在其上设置文本的 Textview 正在给我一个 Nullpointer :(

有没有人可以告诉我我做错了什么? :)

字符串 s 不是 null 或者,它是视图本身。在 oncreate() 中设置文本时它正在工作。

谢谢..

public class smsShower extends Activity{

    private TextView status;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.show);
        //status = (TextView)findViewById(R.id.status);

        status = (TextView)findViewById(R.id.status);
    }

    public void displayText(String s){

        status.setText(s);

    }

}

smsReceiver类:

public class smsreceiver extends BroadcastReceiver {


    private String str;

    private boolean received = false;

    private smsShower smsshow;

    @Override
    public void onReceive(Context context, Intent intent) {
           //---get the SMS message passed in---
        Bundle bundle = intent.getExtras();       
        smsshow = new smsShower();

        SmsMessage[] msgs = null;
        str = "";            
        if (bundle != null)
        {

            Object[] pdus = (Object[]) bundle.get("pdus");
            msgs = new SmsMessage[pdus.length];  


            for (int i=0; i<msgs.length; i++){

                msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]); 

                if(msgs[i].getDisplayOriginatingAddress().equals("1990"))
                {
                    received = true;
                    str += msgs[i].getMessageBody().toString();

                    smsshow.displayText(str);



                }

布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">

<TextView android:id="@+id/status" android:layout_alignParentTop="true" android:text="Status:" android:layout_height="match_parent" android:layout_width="match_parent"></TextView>
</RelativeLayout>

错误日志:

02-18 01:14:20.064: ERROR/AndroidRuntime(18964): Caused by: java.lang.NullPointerException
02-18 01:14:20.064: ERROR/AndroidRuntime(18964):     at com.sms1990.smsShower.displayText(smsShower.java:36)
02-18 01:14:20.064: ERROR/AndroidRuntime(18964):     at com.sms1990.smsreceiver.onReceive(smsreceiver.java:47)
02-18 01:14:20.064: ERROR/AndroidRuntime(18964):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2941)

【问题讨论】:

  • s 字符串是从广播接收器传递过来的...并且传递成功。我检查了一些 log.w 的 :)

标签: android textview


【解决方案1】:

displayText 在哪里调用?是否有可能在onCreate 之前调用它(或至少在onCreate 完成之前)?如果是,您将收到 NullPointerException,因为尚未设置 status

【讨论】:

  • 嗯...我有一个发送和发送短信的类,因此有一个 PendingIntent pi = PendingIntent.getActivity(this, 0, new Intent(sms1990.this, smsShower.class), 0);已创建... smsShower.class 是 displayText 所在的那个... 通过使这个 onCreate 被使用?正确的 ? ...从广播接收器调用displayText(处理返回短信)。返回的短信作为 displayText 中的 s 参数传递。
  • @Roskvist BroadcastReceiver 在哪里获取对活动实例的引用以调用 displayText?
【解决方案2】:

添加一个基本的空检查如下:

public void displayText(String s){
  if (status != null)
    status.setText(s);

}

你不会得到 NPE。您如何开始活动并在广播接收器中获取对它的引用?

【讨论】:

    【解决方案3】:

    我试图检查 onCreate 何时被调用...

    public class smsShower extends Activity{
    
        private TextView status;
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.show);
    
    
            status = (TextView)findViewById(R.id.status);
            status.setText("NewTEXT!!!!!");
        }
    

    我在onCreate中做了一个setText,当应用发送短信时:

    public void sendStatusSMS(String fra,String til)
        {        
        String s = "DSB "+fra+" "+til;
    
        PendingIntent pi = PendingIntent.getActivity(this, 0,
                new Intent(sms1990.this, smsShower.class), 0);                
        SmsManager sms = SmsManager.getDefault();
        sms.sendTextMessage("1990", null, s, pi, null); 
    

    pendingIntent 负责启动 SmsShower 并通过这样做调用 oncreate。

    因此,smsreceiver 在调用 oncreate 后调用 displayText().. 如果我理解正确..

    但仍然是该死的空指针

    【讨论】:

      【解决方案4】:

      正如我所见,sms.sendTextMessage("1990", null, s, pi, null) 函数的第四个参数 pi PendingIntent 将在消息发送后启动您的 smsShower Activity。

      我没有看到广播接收器中捕获的 Intent 来自哪里?您不能直接在 smsShower onCreate() 中解析 Intent 中的“pdus”吗? (尤其是pi PendingIntent 启动 Activity 而不是触发您的代码中所述的 BroadcastReceiver)。

      此外,我对您在 onReceive() 函数中获取对 smsShower Activity 的引用的方式有一种不好的感觉。您在函数的第二行创建了一个新的smsShower,但这并不能保证它与之前启动的 Activity 相同。这实际上或多或少地保证了它不是同一个Activity。

      【讨论】:

        猜你喜欢
        • 2019-06-03
        • 2019-09-30
        • 1970-01-01
        • 2012-05-28
        • 2014-02-07
        • 1970-01-01
        • 1970-01-01
        • 2011-01-19
        • 1970-01-01
        相关资源
        最近更新 更多