2011-10-20 39 views
11

HOẠT ĐỘNG CHÍNHGọi phương thức công khai trong lớp Hoạt động từ một lớp khác?

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) 
     { 

     } 
    } 

Tôi cố gắng để gọi MyMethod() từ một thể hiện của MyClass. Tôi thực sự đánh giá cao sự giúp đỡ nào. Cảm ơn.

+0

bài viết mã mà bạn đã sử dụng để thử gọi myMethod(). Bạn đang instantiating một đối tượng MyActivity? Nếu không, tôi không nghĩ rằng bạn sẽ có thể gọi myMethod() vì nó không phải là tĩnh. Bạn có thể thử làm cho myMethod() tĩnh và sau đó bạn sẽ có thể sử dụng MyActivity.myMethod() từ MyClass của bạn. P.s Tôi thực sự hy vọng bạn đã thay đổi tên của các lớp học của bạn cho mục đích trình diễn ở đây.Nếu đó là những tên mà bạn đang thực sự sử dụng trong dự án của bạn, bạn nên nghiêm túc xem xét việc sử dụng nhiều tên mô tả hơn. Nó sẽ làm cho mã của bạn dễ hiểu hơn. – FoamyGuy

+0

@Tim Tôi đã cố gắng gọi bằng cách sử dụng ngữ cảnh i được truyền cho hàm tạo trong MyClass, như vậy .. – Deepak

+0

Thực tiễn rất xấu là có các phương pháp tĩnh trên Hoạt động, tôi khuyên bạn nên tìm cách để làm những gì bạn cần làm mà không có phương pháp tĩnh trên hoạt động. – SnowyTracks

Trả lời

-8

Tôi quyết định viết lớp HelperClass MyClass làm lớp bên trong lớp MyActivity. Điều này cho phép nó truy cập đầy đủ đến lớp cha mẹ nhưng điều xấu bây giờ là MyClass bị giới hạn chỉ trong lớp 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

Tôi chọn đây là câu trả lời chỉ vì tôi đã sử dụng giải pháp này. Các giải pháp khác có vẻ không kém phần thú vị. – Deepak

+3

Tại sao bạn sao chép người khác trả lời và đánh dấu nó là đã chọn tại bài đăng của riêng bạn? Điều này là lạ ... –

8

Hãy phương pháp đó như tĩnh để bạn có thể gọi mà không cần tạo đối tượng lớp

public static void Mymethod() 
{} 

và gọi như cách này

MainActivity.Mymethod(); 
+0

Tôi không thể làm cho phương thức tĩnh như nó tham chiếu đến các biến không tĩnh. Vì vậy, làm cho MyClass trở thành lớp bên trong của lớp hoạt động giải pháp duy nhất – Deepak

+0

ok Nếu bạn có giải pháp tốt, hãy giữ nó lên – Pratik

21

Tại sao không chỉ vượt qua các hoạt động để các nhà xây dựng như

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

Tôi có một lớp bên trong mà tôi muốn đưa vào một lớp thư viện tổng quát hơn "Người trợ giúp". Tôi đã có cùng một vấn đề bạn làm. Tôi nhận được xung quanh nó bằng cách làm cho lớp trừu tượng trợ giúp, với một phương thức trừu tượng duy nhất. Sau đó, trong gói dự án của tôi, tôi mở rộng lớp trình trợ giúp với một lời gọi hàm dựng trong lớp cụ thể.

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 
} 

Bằng cách này, tôi có một lớp helper có chứa phần lớn các công việc "", và tất cả những gì phải làm là tạo ra một lớp với các nhà xây dựng và một phương pháp để có được quyền truy cập vào các phương thức quan tâm của hoạt động gọi điện.

2

Nếu tôi hiểu chính xác bạn, tôi tin rằng bạn có thể giải quyết vấn đề của mình bằng cách sử dụng giao diện làm gọi lại.

//// HOẠT ĐỘNG /////////////////////////////////

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(){ 

} 

////// Custom Class //////////////////

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

Đây có lẽ là cách tốt nhất để làm điều đó. Đây là cách tôi đang làm nó. Nó được gọi là Mẫu thiết kế 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

Bạn không thể sử dụng "điều này" từ setInstance tĩnh, nhưng có lẽ nó là một phương pháp mát mẻ chỉ muốn biết nếu lớp đó là instantiated –

+0

Eww. Không. Đây là một rò rỉ tài nguyên đang chờ xảy ra –

1

Bạn phải chuyển thể hiện của MainActivity vào một lớp khác, sau đó bạn có thể gọi mọi thứ công khai (trong MainActivity) từ mọi nơi.

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

Nếu tôi sử dụng giải pháp của bạn và nói 2 hoạt động có thể phải truy cập vào lớp học, có cách nào trong lớp để xác định ngữ cảnh hoạt động nào đang được sử dụng không? Lớp học cụ thể của tôi được truy cập bởi 2 hoạt động khác nhau, tôi có thể đặt nó cho chúng tôi như bạn đã chỉ ra cho mỗi, chỉ cần tự hỏi liệu có thể đặt ngữ cảnh thành một biến chung có thể được sử dụng trong lớp của tôi không? Một cái gì đó như currentContext = mà bao giờ hoạt động bối cảnh đang được sử dụng, vì vậy khi tôi phải tham khảo bối cảnh tôi có thể sử dụng currentcContext thay cho mainActivity hoặc secondActivity. – snowman

Các vấn đề liên quan