2013-02-20 48 views
2

我有這樣的的onCreate:Android如何使用公共靜態方法在TextView中設置文本?

final TextView text1 = (TextView) findViewById(R.id.txtNextAlarm); 

我試圖在處於同一類中的方法來設置文本:

public static void NextTxt(){ 
     text1.setText(""); 
} 

但它不承認「的text1 」。

+0

爲什麼'NextTxt'需要是靜態的? – Simon 2013-02-20 22:44:25

+0

@Simon我需要從另一個類中使用該方法 – user1880779 2013-02-20 22:56:29

+1

*如果*(且僅限於)該類在您的Activity中實例化並且可以*保證*該類的生命週期不大於該Activity,則將一個引用傳遞給TextView轉換爲其他類。如果你無法保證一生的話,那麼你就會冒着嚴重的內存泄漏的風險,所以回過頭來問一下回調。 – Simon 2013-02-20 23:06:30

回答

6

的問題是,靜態方法不與任何特定對象相關,但與整個類相關。因此,他們只能看到班上的靜態字段。你的text1變量甚至不是這樣,如果你說的是真的。相反,它是一個只存在於onCreate()方法長度的局部變量。如果你知道你永遠只能有你活動的一個實例(而這可能不是一個不合理的假設),你可以做的是使用

private static TextView text1; 

在類的頂部(或基本上以外的任何地方的方法)。 final修飾符不會爲你購買任何東西。您選擇是公開還是私人,但我傾向於私下默認(除非有其他原因)。

另一種方法是問自己爲什麼NextTxt()是靜態的;如果您將其設爲普通實例方法,那麼您仍然需要在類中聲明text1,但它不需要是靜態的。但是,你需要一個實例來調用它。

+0

我需要在另一個類中使用NextTxt()方法,這就是爲什麼我需要將其設置爲靜態?我發現每個人都對靜態方法和變量持懷疑態度,如果我需要在另一個類中使用方法,這是正確的方法嗎? – user1880779 2013-02-22 22:11:18

+0

您節省了我的時間 – Thamaraiselvam 2016-01-18 19:19:24

+0

在靜態字段中放置Android上下文類(EditText,TextView e.t.c)是一個壞主意,因爲它們將應用程序暴露於內存泄漏而令人不悅。 – 2016-11-02 08:01:08

3
TextView text1; 

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     text1 = (TextView) findViewById(R.id.txtNextAlarm); 
} 

在onCreate方法中進行初始化。

0

text1爲一個local變量,你必須將其聲明爲類的屬性

public final TextView text1; 

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     text1 = (TextView) findViewById(R.id.txtNextAlarm); 
} 

,並在您的靜態方法使用:

public static void NextTxt(){ 
     text1.setText(""); 
} 
0

如果該方法是靜態的,則不能訪問該類的任何非靜態字段。你必須讓你的textField是靜態的或者將它作爲參數傳遞。

static TextView text1; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    MyClass.text1 = (TextView) findViewById(R.id.txtNextAlarm); 
} 

public static void NextTxt(){ 
    MyClass.text1.setText(""); 
} 

當然,你只能有一個文本框設置的時候,因爲它是類的靜態字段。其他選項包括從NextTxt方法中創建單例或刪除靜態修飾符。

1

如果這是真的,這條線是在onCreate方法

final TextView text1 = (TextView) findViewById(R.id.txtNextAlarm); 

再回答你的問題是,text1爲出scope從NextTxt方法中。你已經在一個方法中聲明並初始化了一個變量,並且你試圖從另一個方法訪問它。爲了使NextTxt方法「看到」text1,您需要將該成員移動到兩個方法均可訪問它的位置。

正如其他答案中所提到的,您也正在處理的事實是,onCreate是一個實例方法,而NextTxt是一個靜態方法。爲了「解決」你的問題,你可能會試圖讓所有事情都變成靜態的,但這是一條危險且渺茫的路徑。您無法控制Android殺死您的用戶界面的時間,因此text1可能會在無警告的情況下失效。下一次嘗試調用其上的方法時,您不會喜歡結果。

重新思考你正在嘗試做什麼,如果需要的話將其繪製出來,如果你不明白錯誤,就不要在Eclipse中應用快速修復。

+0

我需要在另一個類中使用NextTxt()方法,這就是爲什麼我需要將其設置爲靜態。我看到每個人都對靜態方法和變量持懷疑態度。那麼如果我需要在另一個類中使用一個方法,那麼這樣做的正確方法是什麼? – user1880779 2013-02-22 22:12:03

相關問題