2011-10-02 100 views
2

我有一个程序,只需按一个按钮就可以向一群人发送预定义的文本消息。我有它的运作良好,但我的问题是,当它发送消息时,它弹出2发送每封邮件吐司。代码:Toast显示两次

package com.mfd.alerter; 

//imports 

public class homeScreen extends Activity { 

//buttons 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    //vars 

    // Grab the time 
    final Date anotherCurDate = new Date(); 
    SimpleDateFormat formatter = new SimpleDateFormat("km"); 
    final String formattedTime = formatter.format(anotherCurDate); 

    // Contacts 
    final String[] numbers = getResources().getStringArray(R.array.numbers); 

    // Start messages. Only 1 is given to shorten post 
    callStructureFire.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      String msgText = "MFD PAGE OUT:\nStructure Fire\nTimeout:"+formattedTime; 
      for (int i = 0; i < numbers.length; i++) { 
       sendSMS(numbers[i], msgText); 
      } 
     } 
    }); 

    //more call types. not important. 
} 

//---sends a SMS message to another device--- 
private void sendSMS(String numbers, String message) 
{   
    String SENT = "SMS_SENT"; 

    PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, 
     new Intent(SENT), 0); 


    //---when the SMS has been sent--- 
    registerReceiver(new BroadcastReceiver(){ 
     @Override 
     public void onReceive(Context arg0, Intent arg1) { 
      switch (getResultCode()) 
      { 
       case Activity.RESULT_OK: 
        Toast.makeText(getBaseContext(), "SMS sent", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
        Toast.makeText(getBaseContext(), "Generic failure", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_NO_SERVICE: 
        Toast.makeText(getBaseContext(), "No service", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_NULL_PDU: 
        Toast.makeText(getBaseContext(), "Null PDU", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_RADIO_OFF: 
        Toast.makeText(getBaseContext(), "Radio off", 
          Toast.LENGTH_SHORT).show(); 
        break; 
      } 
     } 
    }, new IntentFilter(SENT)); 

    SmsManager sms = SmsManager.getDefault(); 
    sms.sendTextMessage(numbers, null, message, sentPI, null);    
} 

//action bar stuff. not important. 

} 

更多细节:假设我发送文本给3个人,6个吐司消息将弹出说“短信发送”。我如何做到这一点,只有3个会出现?

此外,有没有办法可能添加发送的消息计数器?例如:“Message 1/10 sent”,“Message 2/10 sent”等等?

回答

0

是不是应该只注册一次接收器而不是每次调用sendSMS。 因为您有3个BroadCastReceivers,您可以获得6个Toast和3个短信。所以在第一次运行中,你会得到1吐司。在第二轮中,你会得到2个Toasts(在第一轮中被注册的接收者被调用,而在第二个中被注册的接收者)。在第三次运行中,所有三个接收器都会被调用,所以您可以再获得三杯酒。总之 - 6个Toast ...

所以我想,你必须在for循环之前注册一个接收者,然后在sendSMS中调用,或者你想在sendSMS中注册,那么你必须在最后注销的方法。

我希望这会有所帮助, 欢呼!

+0

(我是新来的编程的Java/Android的如此忍受我的条款。)你能告诉我你说什么呢部分约和可能固定?我不确定你在说什么。 – Matt

+0

(运行几个简单的测试后)我相信你在你的正确回应,虽然因为每次我添加联系人,它成倍增加。 – Matt

+0

很高兴你解决了它:) – peshkira

1

我真的不看你的代码或问自己为什么会这样,但这里有一个窍门停止祝酒词出现了两次:

创建使用makeToast()敬酒实例,调用cancel()显示之前,请将您的文字,然后致电show()。这将解雇先前的敬酒。你甚至不会注意到吐司会显示两次。

这是一个愚蠢的解决办法,但它为我工作;-)