2011-01-05 100 views
1

我正在開發一個Android應用程序。屬性類如何在Java中爲其「父」類調用方法?

對於某些任務,我有一個活動parentActivitysubclass。我也有一個隱藏的textView parentActivity。我想從子類中顯示這個textView,但我不知道該怎麼做。

我想我可以從subclass調用parentActivity方法。我怎樣才能做到這一點?

public class ParentActivity extends Activity 
{ 
    private SomeClass mSomeClass; 

    ... 
} 

我想打電話給ParentActivitymSomeClass

在C#中我使用事件偵聽器來做到這一點。

我需要更多的細節告訴我。

謝謝。

+0

我覺得你很困惑關於什麼子類。你如何向我們展示一些代碼。 – Falmarri 2011-01-05 19:32:13

+0

@Falmarri:我剛剛添加了一個例子。抱歉。 – VansFannel 2011-01-05 19:37:44

回答

4

你ParentActivity保持相同

public class ParentActivity extends Activity 
{ 
    private SomeClass mSomeClass; 
} 

在SomeClass的小變化,需要

class SomeClass extends XYZ 
{ 
    ParentActivity parent;   

    SomeClass(ParentActivity p) //Constructor 
    { 
     this.parent = p; 
     ...... 
    } 

    public void someMethodWhereParentAccessIsRequired() 
    { 
     ..... 
     parent.doSomethingOnSomeTextView(); 
     .... 
    } 

} 

最後,當你初始化mSomeClass內ParentActivity:

mSomeClass = new SomeClass(this) 
+0

我要檢查它。 – VansFannel 2011-01-05 19:56:49

+0

很棒!謝謝你,兄弟! – 2013-05-11 13:32:48

2

如果SomeClass是一個非靜態的ParentActivity內部類,那麼您只能從SomeClass直接在ParentActivity中調用方法。

public class ParentActivity { 

    protected void parentActivityMethod() { 
    System.out.println("Method called"); 
    } 

    protected class InnerSomeClass { // This could extend SomeClass 
    protected void callParentMethod() { 
     parentActivityMethod(); 
    } 
    // Maybe override SomeClass methods to invoke ParentActivity methods? 
    } 

    private InnerSomeClass someClass; 

    public ParentActivity() { 
    this.someClass = new InnerSomeClass(); 

    someClass.callParentMethod(); // Will print "Method called" 
    } 


} 

這需要someClass是內ParentActivity實例化。

或者,當您實例化您的SomeClass對象時,您可以傳遞對ParentActivity對象的引用。這也需要您編輯SomeClass定義。


原來的答覆(不再適用):

可以調用通過super關鍵字父類的方法。

一個簡單的例子:

public class Parent { 
    protected String s1; 
    protected void m1() { 
    System.out.println("PARENT M1"); 
    } 
} 

public class Child extends Parent { 

    protected void m1() { 
    System.out.println("CHILD M1"); 
    } 

    public String doSomething() { 
    super.m1(); // Prints PARENT M1 
    m1(); // Prints CHILD M1 

    return s1; // Same as super.s1 because s1 has not been redeclared 

    } 

    public static void main(String args[]) { 
    new Child().doSomething(); 
    } 

} 
+0

對不起,我沒有解釋得很好。我剛剛爲我的問題添加了一個示例。 – VansFannel 2011-01-05 19:38:27

1

mSomeClass不是的ParentActivity 「子活動」。 mSomeClass絕對不知道什麼類「包含」它。這是一個非常明顯的跡象,表明您的設計存在嚴重缺陷。你試圖完成什麼?

+0

mSomeClass是一個使用C++渲染東西的OpenGL渲染器。從C++我可以從mSomeClass調用一個方法,但我需要從parentActivity調用一個方法來顯示一個TextView。 – VansFannel 2011-01-05 19:43:34

+0

我的答案取決於你不能改變mSomeClass的事實。如果您是製作mSomeClass並可以更改構造函數的人,您可以像@Sarwar所建議的那樣執行,並將指針傳遞給您的父類。只要小心存儲對上下文的引用,因爲這可能導致內存泄漏。然而,在包含該特定對象的對象中沒有調用方法的一般方法。 – Falmarri 2011-01-05 20:34:32

+0

和選秀者呢? http://tseng-blog.nge-web.net/blog/2009/02/17/how-implement-your-own-listener-android-java/ – VansFannel 2011-01-06 07:42:12