2011-10-20 66 views
11

主要活動從另一個類調用Activity類中的公共方法?

public class MyActivity() extends Activity 
    { 
     onCreate() 
     { 
      MyClass myobj=new MyClass();  
     } 
     public void Mymethod() 
     {} 
    } 
//HELPER CLASS IN A SEPARATE FILE  
    public class MyClass() 
    { 
     MyClass(Context context) 
     { 

     } 
    } 

我試圖從MyClass的實例調用的MyMethod()。 我真的很感激任何幫助。謝謝。

+0

發佈自己用來嘗試調用myMethod的代碼()。你是否實例化一個MyActivity對象?如果沒有,我不認爲你可以調用myMethod(),因爲它不是靜態的。您可以嘗試製作myMethod()靜態,然後您應該可以使用MyClass中的MyActivity.myMethod()。附:我真的希望你們在這裏爲了演示的目的而改變了課程的名稱。如果這些是他們在項目中實際使用的名稱,則應認真考慮使用更多描述性名稱。它會讓你的代碼更易於理解。 – FoamyGuy

+0

@Tim我試圖調用使用我傳遞給MyClass中的構造函數的上下文,就像這樣.. – Deepak

+0

在活動上使用靜態方法是非常糟糕的做法,我強烈建議您找到一種方法來執行您需要執行的操作對活動沒有靜態方法。 – SnowyTracks

回答

-8

我決定編寫HelperClass MyClass作爲MyActivity類的內部類。這允許它完全訪問父類,但是現在MyClass僅限於MyActivity類。

public class MyActivity() extends Activity 
{ 
    onCreate() 
    { 
     MyClass myobj=new MyClass(); 

    } 

    public void myMethod() 
    { 

    } 
} 
//INNER CLASS 
    public class MyClass 
    { 
     public MyClass() 
     { 

     } 
     //I can directly access the MyMethod 
     myMethod(); 
    } 
+0

我選擇這個答案只是因爲我使用了這個解決方案。其他解決方案似乎同樣有趣。 – Deepak

+3

爲什麼你複製別人的答案並將其標記爲在自己的帖子中被選中?這很奇怪...... –

8

作出這樣的方法靜態的,所以您可以在不創建類對象

public static void Mymethod() 
{} 

呼叫和呼叫像這樣

MainActivity.Mymethod(); 
+0

我不能將該方法設爲靜態,因爲它引用了非靜態變量。所以是把MyClass作爲活動類的內部類唯一的解決方案 – Deepak

+0

好的如果你有解決方案,它的好處保持它 – Pratik

21

爲什麼不只是傳遞活動構造像

public class MyActivity extends Activity { 

    onCreate(){ 
     MyClass myobj=new MyClass(MyActivity.this);  
    } 

    public void myMethod(){ 

    } 
} 

//HELPER CLASS IN A SEPARATE FILE  
public class MyClass{ 
    public MyClass(MyActivity act) { 
     act.myMethod(); 
    } 
} 
2

我有一個內部類,我想把它拉進更通用的庫「助手」類。我遇到了同樣的問題。我通過使用抽象方法使輔助類抽象來解決這個問題。然後在我的項目包中,我使用特定類中的構造函數調用擴展了助手類。

public class MyActivity extends Activity { 
    onCreate() { 
     MyHelperClass = new MyHelperClass(this, "foobar"); 
    } 

    public void myMethod() { 
     // Code... 
    } 
} 

// In a different file 
public class MyHelperClass extends HelperClass { 
    private MyActivity mInstance; 

    public MyHelperClass(MyActivity act, String data) { 
     super(); 
     this.mInstance = act; 
     this.mActivity = act; // Useful for calling generic Activity methods in the HelperClass 
     this.mData = data; 
    } 

    protected void callMyActivityMethod() { 
     mInstance.myMethod(); 
    } 
} 

// In a different file 
public abstract class HelperClass { 
    protected Activity mActivity; 
    protected String mData; 

    public HelperClass() { 
     // Subclass will set variables 
    } 

    protected abstract void callMyActivityMethod(); 

    // More code for all the other stuff the class does 
} 

這樣,我有一個包含絕大多數的「工作」的輔助類,而我所要做的就是讓用構造一個子類和一個方法,以獲得訪問調用活動的興趣方法。

2

如果我正確理解你,我相信你可以使用接口作爲回調來解決你的問題。

//// ACTIVITY /////////////////////////////////

public class MyActivity() extends Activity { 

    onCreate() 
    { 
     MyClass myObj=new MyClass(); 

     //Set the listener on the object. Created as anonymous 
     myObj.setListener(new MyClass.Listener() { 
      myMethod(); 
     }); 
    } 
} 

public void myMethod(){ 

} 

//////自定義類//////////////////

public class MyClass { 
    Listener mListener; 

    public interface Listener { 
      public void onInterestingEvent(); 
    } 

    public void setListener(Listener listener) { 
      mListener = listener; 
    } 

    public void someUsefulThingTheClassDoes() { 
      //Do your code here and when you're ready to call the activity's method do this 
      mListener.onInterestingEvent(); 
    } 
} 
7

這可能是最好的方法。這是我如何做的。這就是所謂的一個Singleton設計模式:

public class MyActivity extends Activity { 
    private static MainActivity instance; 

    public static MainActivity getInstance() { 
    if(instance==null){ 
      setInstance(this); 
     } 
     return instance; 
    } 

    public static void setInstance(MainActivity instance) { 
     MainActivity.instance = instance; 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     setInstance(this); 
    } 
} 
+1

你不能在靜態setInstance中使用「this」,但也許這是一個很酷的方法,只是想知道該類是否被實例化了。 –

+0

Eww。不可以。這是一個等待發生的資源泄漏 –

1

你要通過MainActivity的實例到另一個類,那麼你可以從任何地方撥打都公開(在MainActivity)。

MainActivity.java

public class MainActivity extends AppCompatActivity { 

    // Instance of AnotherClass for future use 
    private AnotherClass anotherClass; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // Create new instance of AnotherClass and 
     // pass instance of MainActivity by "this" 
     anotherClass = new AnotherClass(this); 
    } 

    // Method you want to call from another class 
    public void myMethod(){ 
     ... 
    } 
} 

AnotherClass.java

public class AnotherClass { 

    // Main class instance 
    private MainActivity mainActivity; 

    // Constructor 
    public AnotherClass(MainActivity activity) { 

     // Save instance of main class for future use 
     mainActivity = activity; 

     // Call method in MainActivity 
     mainActivity.myMethod(); 
    } 
} 
+0

如果我使用您的解決方案,並說有2個活動可能需要訪問該類,那麼在該類中是否有任何方法來確定正在使用哪個活動上下文?我的特定類可以通過2種不同的活動訪問,我可以按照每個類所顯示的來設置它,只是想知道是否可以將上下文設置爲可以在我的課程中使用的一般變量?例如currentContext =正在使用哪個活動上下文,所以當我必須引用上下文時,我可以使用currentcContext來代替mainActivity或secondActivity。 – snowman

相關問題