Как изменить текст в Textview - PullRequest
2 голосов
/ 18 февраля 2011

Вечер:)

У меня есть небольшая проблема ...

Как вы можете видеть в моем коде ниже, Textview, на котором я пытаюсь установить текст, получает мне нулевой указатель: (

Есть ли кто-нибудь, кто может сказать мне, что я делаю неправильно?:)

И строка s не пуста, или это само представление.Работает при установке текста в 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);

    }

}

smsReceiverclass:

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)

Ответы [ 4 ]

4 голосов
/ 18 февраля 2011

Где вызывается displayText?Возможно ли, что он вызывается до onCreate (или, по крайней мере, до завершения onCreate)?Если это так, вы получите исключение NullPointerException, поскольку status еще не установлено.

0 голосов
/ 18 февраля 2011

Как я вижу, четвертый параметр функции sms.sendTextMessage("1990", null, s, pi, null), pi PendingIntent, запустит вашу активность smsShower после отправки сообщения.

Чего я не вижу, так это гдеОткуда исходит намерение, которое попадает в ваш приемник?Разве вы не можете вместо этого разобрать «pdus» из Intent непосредственно в smsShower onCreate ()?(особенно когда pi PendingIntent запускает Activity, а не запускает BroadcastReceiver, как указано в вашем коде).

Также у меня плохое предчувствие того, как вы получаете ссылку на вашу активность smsShower вonReceive() функция.Вы создаете новый smsShower во второй строке функции, но это не гарантирует, что это то же действие, которое было начато ранее.На самом деле это более или менее гарантия того, что это не одно и то же действие.

0 голосов
/ 18 февраля 2011

Я пытался проверить, когда вызывается 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!!!!!");
    }

я сделал setText в onCreate, и когда приложение отправляет смс:

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 вызывает displayText () после вызова oncreate .. если я правильно понимаю ..

Но все же этот чертов нулевой указатель

0 голосов
/ 18 февраля 2011

Добавьте базовую нулевую проверку следующим образом:

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

}

вы не получите NPE.Как начать работу и получить ссылку на нее в эфире?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...