2013-02-09 283 views
0
public class MainActivity extends Activity { 

    TextView textview; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    this.getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 
    setContentView(R.layout.activity_main); 

     textview = (TextView)findViewById(R.id.textView6); 
     //other method,startservice()and so on. 

     //and there is BroadcastReceiver to receive a flag from service. 
     public static class Receiver extends BroadcastReceiver{ 

     @Override 
      public void onReceive(Context context, Intent intents) { 
      intents.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      textview.setText("set"); 

這裏是我的代碼。 所有我想要的是textview.setText()onReceive。訪問非靜態類的靜態類

我第一次嘗試,textview是靜態的。 但是另一種方法正在運行時,靜態變量似乎被殺死。 textview被設置爲空,不能設置settext。

所以我嘗試讓textview不是靜態的。 但還有第二個問題。 當我這樣做,我必須得到新的MainActivity()訪問textview。 這沒有奏效well.complicated。

如何從靜態方法獲取textview。

回答

0

您不能訪問非靜態變量/方法靜態的方法中,因爲靜態方法存在無論如果你的類的實例或沒有

你可以保持您的MainActivity的靜態實例(初始化它在onCreate構造或),並用它來訪問textview

例如

public class MainActivity extends Activity { 
    private static MainActivity instance; 

    protected void onCreate(Bundle savedInstanceState) { 
     instance = this; 
    } 

    public void onReceive(Context context, Intent intents) { 
    instance.textview.setText("set");  
} 

我不知道WH在你試圖在這裏實現或者當這個onReceive被調用時,但是對於BroadcastReceiver而言靜態類似乎並不好。

另一件事,你將需要更新textviewUI thread您可以使用runOnUiThread

instance.runOnUiThread(new Runnable() { 

     public void run() { 
      // update your textview    
     } 
    }); 
+0

非常感謝呢!我知道有靜態廣播不好。但是,當onReceive被調用時,它需要是靜態的。我認爲有廣播接收者類作爲其他編譯文件,那麼設置文本就要複雜一些。如果你有時間,請教我如何。 – user2027811 2013-02-09 11:39:49

+0

爲什麼'BroadcastReceiver'需要是靜態的?一般情況不應該如此 – iTech 2013-02-09 20:40:55