2015-12-27 40 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();简直要被改写为​​