2015-06-12 4 views
1

Спойлер: этот пост может содержать какой-то глупость, так как используется для C и нового для Java программированияПоказаны тосты из непрофессионального класса. Ploblem установки контекста тоста

Существует деятельность MainActivity и общественный класс неактивности, содержащий ряд методы. Мне нужно, чтобы показать предупреждение тостов для некоторых из них

Текущих попыток что-то вроде этого, который терпит неудачу с «Non-статический метод не может ссылаться из статического контекста» для getApplicationContext():

void errorWarn (String warning) { 
    Context context = android.content.ContextWrapper.getApplicationContext(); 
    Toast.makeText(context, "Something's wrong in " + warning, Toast.LENGTH_SHORT).show(); 
} 

Итак, как назвать тосты из не-активного класса?

UPD: errorWarn должен быть вызван из методов в классе. Таким образом, если возникает ошибка в методе класса, должно быть предупреждение

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

UPD2: Полная структура.

MainActivity:

public class MainActivity extends ActionBarActivity { 
    <...> 
    public void ButtonClick (View view) { 
     Class.testfunc(""); 
    } 
} 

Класс:

public class Class { 
    void errorWarn (Context context, String warning) { 
     Toast.makeText(context, "Something must be wrong. " + warning, Toast.LENGTH_SHORT).show(); 
    } 
    void testfunc (String string) { 
     errorWarn(string); 
    } 
} 
+4

Если вам нужно: 'static void errorWarn (контекст контекста, предупреждение о строках) {...}', как если вам нужно показать тост, вы всегда можете иметь соответствующий контекст – Selvin

ответ

3

Определите метод так, что он принимает Context в аргументе и передать ваши Activity к нему.

в YourOtherClass

public class YourOtherClass { 

    public void showToast(Context context, String message){ 
     Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); 
    } 
} 

или если вы хотите принять контекст в конструкторе и использовать showToast только в YourOtherClass:

public class YourOtherClass { 

    private Context context; 

    public YourOtherClass(Context context){ 
     this.context = context; 
    } 

    private void showToast(String message){ 
     Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); 
    } 
} 

в MainActivity

new YourOtherClass().showToast(this, message); 

или если у вас есть переменная Context членов YourOtherClass и вы хотите передать Context в конструкторе YourOtherClass, вы могли бы сделать

new YourOtherClass(this).showToast(message); 
// showToast doesn't have to take a Context as argument, it could just take one as constructor parameter and hold that. 
// But then you have to make sure YourOtherClass is not used anymore if the Activity is closed. 

И за ошибки, которые вы получили в коде ваших предоставляемых :

Context context = com.example.ex3.MainActivity; 

Это не удается, потому что вы пытаетесь присвоить тип экземпляру.

MainActivity.errorWarn("here"); 

Это терпит неудачу, потому что вы вызываете, не статический метод (метод не имеет статический модификатора в своей подписи), как если бы это было статичным. Посмотрите на this question для более подробной информации о статических и нестатических методах.

Не зная, что делает YourOtherClass или как его жизненный цикл связан с деятельностью, это трудно сказать, но прикосновение к пользовательскому интерфейсу от класса, который не связан с UI, и не имеет ссылки на Context, вы можете использовать, это странно. Взятие Context в качестве аргумента конструктора YourOtherClass, вероятно, вам нужно, но будьте осторожны с утечкой Context и Activity жизненного цикла.

+0

Проблема заключается в том, что showToast вызывается из класс, но я получаю такие сообщения, как «Нестатические ** x ** нельзя ссылаться из статического контекста» – Alex

+0

Есть ли способ объявить класс как нестатический, чтобы не было проблем вызывать нестатические методы из этого? Похоже, что все это решит – Alex

+0

Я отредактировал свой ответ, надеюсь, он ближе к тому, что вы хотите. Тем не менее, я призываю вас задуматься над последним абзацем: может быть, есть простой выход (передача Контекста в конструкторе и использование его в showToast)? В более общем случае те ошибки, которые вы получили, были больше связаны с Java, чем Android, поэтому я бы рекомендовал вам прочитать о чистой Java (в частности, книги, подготовившие вас к сертификатам Java SE, которые в значительной степени ориентированы на языковые особенности) и Effective Java, которые является обязательным для чтения при работе с ограниченными ресурсами), это сделает вас лучшим Android-программистом;) – 2Dee

1

Pass контекст парам

void errorWarn (Context context,String warning) { 
     Toast.makeText(context, "Something's in wrong " + warning, Toast.LENGTH_SHORT).show(); 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^