2015-12-27 199 views
4

在Android上使用Java進行編程時,經常需要處理這種錯誤。例如我有一個班,我設置了一個標誌。從外部調用非靜態方法

public class ViewActivity extends Activity { 
... 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
    ... 
} 

在另一類我想重置FLAG_KEEP_SCREEN_ON

class DrawOnTop extends View { 
... 
if (condition) { 
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
} 

但是,這並不工作,因爲我得到「的方法getWindow是未定義的類型DrawOnTop」。

所以我嘗試定義ViewActivity類clearFlags方法

void clearFlags() { 
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
} 

,並把它從DrawOnTop級呼叫:

if (condition) { 
     ViewActivity.clearFlags(); 
    } 

這並不工作,以及:我得到「不能對ViewActivity類型的非靜態方法clearFlags()進行靜態引用「。 那麼,讓我們把它變成靜態的吧。

static void clearFlags() { 
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
} 

,然後我得到「不能讓從活動類型的靜態引用非靜態方法getWindow」

我怎麼能執行這樣的說法?

+2

您需要將*實際*'ViewActivity'實例,並使用*參考,從裏面'DrawOnTop' *。 –

回答

1

如果您的DrawOnTop類嵌套在ViewActivity中,您可以創建一個本地Context變量並使用它調用getWindow()。如果情況並非如此,那麼在您的活動課堂中創建一個接收器,然後從DawOnTop發送一個意圖與您的觸發器來執行任何工作。不要實例化你的活動課,不好主意!

-1

也許你應該在你的靜態方法中引用一個初始化的對象。因此,而不是:

void clearFlags() { 
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
} 

你應該創建你的窗口的靜態實例變量:

private static staticWindowInstance; 

void clearFlags() { 
getStaticWindowInstance().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
} 

欲瞭解更多信息,你應該看看Singleton design pattern

+1

靜都沒有答案。 –

0

您可以將getWindow()作爲參數發送到clearFlags方法。 呼叫clearFlags(Window window)從您的活動:WindowHelper.getInstance().clearFlags(getWindow());

Helper類:

public class WindowHelper { 

    public static final WindowHelper instance = new WindowHelper(); 

    public static WindowHelper getInstance() { 
     return instance; 
    } 

    public void clearFlags(Window window) { 
     window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
    } 
} 
0

我試圖落實Aksaçlı建議的解決方案,這被證明是非常簡單的:

在ViewActivity類DrawonTop是這樣稱呼: mDrawOnTop = new DrawOnTop(this);

第二類的構造函數包含此:

public DrawOnTop(Context context) { 
      super(context); 

因此ViewActivity.clearFlags();簡直要被改寫爲​​

相關問題