2011-12-08 19 views
1

MYI不明白爲什麼我得到這個編譯錯誤:訪問調用活動的方法從一個對象在其中創建

public class Main_screen extends ListActivity { 

     List<Object> completeList; 
     private My_ArrayAdapter adapter; 


    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     completeList = getCompleteList(); 
     adapter = new My_ArrayAdapter(this, completeList); 
     setListAdapter(adapter); 
     } 

    public void doSth() { 
       ... 
     } 
    } 

和My_ArryAdapter:

public class My_ArrayAdapter extends ArrayAdapter<Object> { 

     private final List<Object> list; 
     private final Activity context; 


     public My_ArrayAdapter(Activity context, List<Object> list) { 
      this.context = context; 
      this.list = list; 

     } 

     public void tryIt() { 
      context.doSth(); // <-------- THIS DOES NOT WORK, this method can not be called 
     } 
    } 

請解釋一下,是有一些基本的東西我還沒有明白。我只是將上下文傳遞給我創建的ArrayAdapter實例。從這個例子中,我想了解一下調用者的方法。

爲什麼要這樣做不可能?

非常感謝!

回答

5

試試這個:

public void tryIt() { 
      ((Main_screen)context).doSth(); 
     } 

上下文是活動現在也沒有doSth(),但Main_screen了,所以你要拋棄這一類

+0

經過幾天的搜索後來到這裏,你的帖子對我很有幫助。我不確定如何在當前應用程序中引用另一個類的這個實例,並且這個工作正常。 Tha,在那裏爲我節省了很多時間。 – Janpan

+0

終於:D謝謝馬恩你拯救了我的生命,我欠你一啤酒 –

0

您可以使用下面的代碼。很明顯,context類不包含對象doSth()doSth()class Main_screen中聲明。

public class My_ArrayAdapter extends ArrayAdapter<Object> { 

     private final List<Object> list; 
     private final Activity context; 


     public My_ArrayAdapter(Activity context, List<Object> list) { 
      this.context = context; 
      this.list = list; 

     } 

     public void tryIt() { 
      Main_screen.doSth(); 
     } 
    } 
+0

我以爲應用程序運行時會創建一個Main_screen實例,它有一個方法doSth()。所以當我將「this」傳遞到創建的My_ArrayAdapter時,我有實例方法的實例。您的建議是調用Main_screen的類方法 - 由於沒有類方法doSth,所以不能使用。但謝謝你的建議! – user387184

+0

我只在發佈答案後才注意到您的代表。如果我以前做過,我不敢回答。我現在很尷尬。大聲笑。快樂的編碼。 –

1

其實你正在Activity context對象並通過Activity(即Main_Screen)的孩子,其名爲向上投(Implicit Casting)。

所以Activity(作爲父母)沒有方法doSth()。所以你需要向下投射(顯式投射)使其成爲Main_Screen

兩種方法可以做到這一點。

使Main_Screen context代替Activity context

強制轉換爲Main_Screen的對象在tryIt()方法利用Main_Screen方法,這樣的方法:

if(context.isInstance(Main_Screen.class)) 
{ 
    ((Main_Screen)context).doSth() 
} 

你也可以使用try catch來使機會最小化ClassCastException

0

我是如何做到的

StaticCommonDataClass - >在這裏維護靜態數據我將保持活動一的實例在它。

ActivityOneClass - >包含我必須在ActivityTwo中實際訪問的方法。

ActivityTwoClass =>將訪問ActivityOne方法。

我討厭的是將兩個參數從一個函數傳遞給其他函數,或者一個類傳遞給其他類, 也是這樣,當它必須一次又一次地完成相似的值。

在這裏,我將存儲參考ActivityOneClass靜態變量。

public class CommonStaticData { 

    private static Activity _activity; 
    private static Context _context; 

    public static void setactivity(Activity activity) { 
     _activity = activity; 
    } 

    public static Activity getactivity() { 
     return _activity; 
    } 

    public static void setcontext(Context context) { 
     _context = context; 
    } 

    public static Context getcontext() { 
     return _context; 
    } 



} 


public class ActivityOneClass extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity1); 

     CommonStaticData.setactivity(ActivityOneClass.this); //will keep the instance alive for this activity 
    } 

    Public void activityOneMethod() 
    { 
     //Set of statements 
    } 
} 



public class ActivityTwoClass extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity2); 

     ((ActivityOneClass) CommonStaticData.getactivity()).activityOneMethod(); 

     //we need to typecast the instance stored in CommonStaticData.getactivity() to "ActivityOneClass" thats is the 
     //activity containing the method so as to access the method otherwise it will not come in the intellisense window and will generate Compiler Error 
    } 
} 
相關問題