[英]Calling a non-static method in an android OnPreferenceClickListener
/**
* A preference change listener to resynchronize a contact list
*
*/
private static Preference.OnPreferenceClickListener resynchronizeContactsListener = new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
new AlertDialog() {
}
}
}
在上述代碼段中,我需要調用非靜態方法或創建AlertDialog()。 由於偵聽器是靜態方法,因此我都很難做到這兩個方面。
例如,AlertDialog.Builder()構造函數需要創建一個android上下文對象,但是由於該方法是靜態的,因此沒有上下文。 我考慮過將上下文作為參數傳遞,但是我不確定在哪里進行傳遞而不會損害我重寫方法的事實。
提前致謝
基本上,靜態方法不能調用非靜態方法,但是我們可以使用引用,該引用在靜態方法中包括非靜態方法。
public class StaticMethodTest{
void NonStaticMethod(){
System.out.println("This is a non-sataic method.");
}
static void StaticMethod(StaticMethodTest s){
System.out.println("This is a static method.");
s.NonStaticMethod();
}
public static void main(String[] args) {
StaticMethodTest sObj=new StaticMethodTest();
StaticMethod(sObj);
}}
這是一個Java示例,我想您可以使用這種方式來創建對象,並將其引用用作靜態方法。 希望它能對您有所幫助。
您可以將Preference.OnPreferenceClickListener靜態地實現到自己的類中,並在准備好時從活動代碼中對其進行初始化。 (出於某種原因,我假設您需要將監聽器對象設為靜態,您可以取消該對象!)
private static MyPrefListener myPrefListener = null;
private static class MyPrefListener implements Preference.OnPreferenceClickListener {
private Context mContext;
public MyPrefListener(Context context) {
this.mContext = context;
}
@Override
public boolean onPreferenceClick(Preference preference) {
//USE mContext as the context object here
return false;
}
}
然后在您的活動代碼中,執行以下操作:
myPrefListener = new MyPrefListener(this);
我希望代碼的結構清晰。
只需從聲明中刪除static
關鍵字即可。
當類或接口是內部類但未引用其包含的類時,則將其聲明為靜態的類或接口(注意不是實際的實例化對象,只是類定義)。 例如
public class Foo {
public static class Bar {
}
}
Bar不能引用Foo的任何狀態,並且可以使用new Foo.Bar()
獨立實例化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.