Правильный контекст для Toast в Activity вызывается из сервиса? - PullRequest
0 голосов
/ 25 января 2012

Я получил следующий метод в своей основной деятельности

public void showMessages(int MSGCODE) {
    Log.d("MSG", "showmessage reached with code " + MSGCODE);
    switch (MSGCODE) 
    { 
      case '0': 
        Toast.makeText(tabHost.getContext(), "Account verification failed. Please try to reenter your password.", Toast.LENGTH_LONG).show(); 
        break; 
      case '1': 
        Toast.makeText(tabHost.getContext(), "Networking Service started.", Toast.LENGTH_LONG).show();
        break; 
      case '2': 
        Toast.makeText(tabHost.getContext(), "Networking Service stopped.", Toast.LENGTH_LONG).show(); 
        break; 
      case '3': 
        Toast.makeText(tabHost.getContext(), "Connection to server failed.", Toast.LENGTH_LONG).show();
        break; 
    }
}

В службе я вызываю метод, подобный этому:

MAIN_ACTIVITY.showMessages(Consts.CONNECTION_FAILED);

Но тоста не появляетсяTabHost содержит три разных вкладки.Я уже понял, что это неправильный контекст, который я выбираю, но я не знал, какой из них правильный и как его получить.

private TabHost tabHost;
private final String[] loginStrings = new String[2];

public static Boolean runOnce = true;
public static ArrayList<String> messages;
private Intent svc;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    tabHost = getTabHost();
    Intent intent = new Intent().setClass(this, BuddylistActivity.class);
    tabHost.addTab(tabHost.newTabSpec("tabBuddylist").setIndicator("Buddylist").setContent(intent));
    intent = new Intent().setClass(this, ChatsActivity.class);
    tabHost.addTab(tabHost.newTabSpec("tabBuddylist").setIndicator("Chats").setContent(intent));
    intent = new Intent().setClass(this, SchedularActivity.class);
    tabHost.addTab(tabHost.newTabSpec("tabBuddylist").setIndicator("Schedular").setContent(intent));

Ответы [ 3 ]

2 голосов
/ 25 января 2012

попробуйте сделать showMessages() статическим и передать Context в качестве параметра.

public static void showMessages(Context context, int MSGCODE)

Вы можете показывать свои сообщения Toast, например

Toast.makeText(context, "Networking Service started.", Toast.LENGTH_LONG).show();

, и вызывая этот метод из сервиса, вы можете просто передатьthis в качестве контекста:

MAIN_ACTIVITY.showMessages(this, Consts.CONNECTION_FAILED);

Таким образом, ваши тосты будут отображаться, даже если само действие было уничтожено.

Вы можете сохранить свой исходный (non-static метод) и реализовать его как

public void showMessages(int MSGCODE){
     showMessages(this, MSGCODE); //calls static method with current context
}
0 голосов
/ 02 января 2013

Это то, как я делаю тостовые сообщения,

Toast toast = Toast.makeText(contetx, Message, Duraction);
toast.show(); //This being the part that is missing

Я могу быть совершенно не прав, но я всегда использую метод toast.show (), чтобы отобразить его

0 голосов
/ 25 января 2012

должно быть

Toast.makeText(getApplicationContext(), "Connection to server failed.", Toast.LENGTH_LONG).show();
...