2012-05-28 1 views
0

У меня есть класс, который контролирует мою прикладную логику, кроме того, кто расширяет Activity, и ее объявляет внутри этого последнего.Использование Toast во внешнем классе

Хотелось бы узнать, есть ли способ использовать тост в этом классе.

Я пробовал расширять этот класс с помощью Activity и отправлять контекст в его конструкторе, но он не работал.

EDIT:

Здесь вы код, как я прохожу контекст в конструкторе:

GameController newgame = new GameController(getApplicationContext()); 

public GameController(Context _context) 
{  
    //...  
    context = _context; 
} 

Toast.makeText(context, "You can't bet this amount, the minimun bet is: " + minimun_bet, 2).show(); 

Когда я запускаю это я получаю эту ошибку:

05-29 10:58:06.230: E/AndroidRuntime(5753): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
+0

Вы можете вставить код своего конструктора –

+0

Каким бы ни был ваш класс управления логикой, он должен быть создан из какой-либо деятельности. Поэтому добавьте член 'Context' в свой класс управления и передайте' this' его конструктору из действия. –

+0

Код, который я использую в конструкторе, просто добавлен. – AZorrozua

ответ

1
public class ClassName {   
    public ClassName(Activity _activity) { 
      Toast.makeText(_activity, "text", Toast.LENGTH_LONG).show(); 
    } 
} 

вы можете использовать его как ClassName (YourActivity.this);

+0

Я получаю ту же ошибку времени выполнения, используя этот способ: 05-29 11: 11: 05.027: E/AndroidRuntime (5862): java.lang.RuntimeException: не удается создать обработчик внутри потока, который не вызвал Looper.prepare() – AZorrozua

0

Класс не должен быть расширен из Activity, но вам нужно каким-то образом передать ему контекст для использования. Это может быть контекст активности или контекст приложения.

Просто убедитесь, что он не поддерживает контекст навсегда.

3

Toast должен использовать только контекст для отображения. Все, что вам нужно сделать, это передать контекст этому классу, и все будет хорошо. Я делаю это все время для всех своих классов. Если вы могли бы поделиться тем, как вы реализуете/вызываете этот передающий Контекст в конструкторе, мы могли бы помочь указать.

В основном, это что-то вроде этого:

public MyClass{ 
    private Context context; 
    public MyClass(Context context){ 
     this.context = context; 
    } 
    private void alert(String msg){ 
     Toast.makeText(this.context, msg, Toast.LENGTH_LONG).show(); 
    } 
} 

Теперь, что вы хотите сделать, это проверить, чтобы убедиться, что контекст является действительным или нет, когда вы передаете в него. Существует так много случаев, когда я случайно использую getBaseContext вместо getApplicationContext, и это вызывает проблему. Но на самом деле вы можете просто передать свою активность и использовать ее как Контекст без каких-либо проблем.

+0

Я пробовал этот путь, но получаю ошибку времени выполнения. Вы можете увидеть код в первом посте. – AZorrozua

+0

Вы лаете неправильное дерево. В сообщении об ошибке указано, что вы вызываете Toast.show() из потока, отличного от UI. Надеюсь, вы на самом деле делаете toast.show() каким-то методом, а не непосредственно внутри класса. Я думаю, что у вас, вероятно, есть поток или, возможно, GameController - это поток/runnable. Это объяснит ошибку. Если вы переместите toast.show() в конструктор и по-прежнему получаете ошибку, то я думаю, что это будет правильно, насколько я знаю. Возможно, у вас есть метод runOnUIThread в классе, который вы распространяете или внутри потока. Попытайтесь проверить это. – RobGThai

+0

Да, я пытаюсь вызвать toast.show() в не-UI ** классе **, но не в другом потоке. На самом деле, я создаю экземпляр от GameController в моем основном (и UI) классе, вот что начинается поток. И тогда, когда экземпляр GameController выполняет свою работу и нуждается в нем, он создает тост и делает шоу. Произошла ошибка. – AZorrozua

0

Попробуйте он работал для меня

В вашей деятельности

Context контекст = новый YourClass() getAndSetMyContext (Activity.this).

В вашем классе закрытый статический контекст c;

public Context getAndSetMyContext(Context c) { 
    this.c = c; 
    return this.c; 
} 

в способе, где вам нужно Тост просто использовать

Toast.makeText (с, сообщение, Toast.LENGTH_SHORT) .show();