2015-06-12 38 views
1

擾流板:該郵件可能包含一些愚蠢的事,由於使用C和新的Java編程顯示來自非活動班的吐司。 Ploblem上下文設置敬酒

有一個活動MainActivity並含有許多的公共非活性類方法。我需要顯示敬酒警報其中一些

目前的企圖是這樣的,它失敗()「非靜態方法不能從靜態上下文中引用」爲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(Context context,String warning){...}'當您需要顯示敬酒時,您始終可以擁有適當的上下文 – 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); 

,或者如果你有YourOtherClass一個Context成員變量,你要傳遞的ContextYourOtherClass構造函數,你會做

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"); 

,因爲要調用非靜態方法(該方法在其簽名沒有static修飾符),如果它是一個靜態此失敗。有關靜態方法和非靜態方法的更多詳細信息,請參閱this question

不知道YourOtherClass做什麼或如何將其生命週期鏈接到活動的,很難說,但不得不觸摸UI不是UI相關的類,並且沒有任何可用的Context,這感覺很奇怪。以Context作爲YourOtherClass構造函數的參數可能是您需要的,但請注意漏掉ContextActivity生命週期。

+0

問題是showToast將從該類,但我得到的消息,如「非靜態** x **不能從靜態上下文中引用」 – Alex

+0

有沒有辦法將該類聲明爲非靜態,以便沒有問題來調用非靜態從它的方法?看起來它會解決所有問題 – Alex

+0

我編輯了我的答案,希望它更接近你想要的。不過,我鼓勵你反思最後一段:也許有一個簡單的出路(在構造函數中傳遞Context並在showToast中使用它)?更一般的說法是,你得到的錯誤與Android相關的Java相關的更多,所以我建議你閱讀關於純Java的知識(特別是爲J​​ava語言技術專注的Java SE認證書,以及有效的Java在使用有限的資源時是必讀的),它會使你成爲一個更好的Android程序員;) – 2Dee

1

傳遞上下文PARAM

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