簡體   English   中英

在Android OnPreferenceClickListener中調用非靜態方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM