【问题标题】:accessing a calling activity's method from within an object it created从它创建的对象中访问调用活动的方法
【发布时间】:2011-12-08 10:35:17
【问题描述】:

我不明白为什么会出现编译错误:

   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 实例中。在这个实例中,我想访问调用者的方法。

为什么这不可能?

非常感谢!

【问题讨论】:

    标签: android methods


    【解决方案1】:

    试试这个:

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

    context 是 Activity,它没有 doSth(),但 Main_screen 有,所以你应该转换到这个类

    【讨论】:

    • 经过几天的搜索来到这里,您的帖子对我帮助很大。我不确定如何在当前应用程序中引用另一个类的这个实例,这很有效。 Tha,为我节省了很多时间。
    • 最后 :D 谢谢你救了我的命,我欠你一杯啤酒
    【解决方案2】:

    实际上,您正在制作Activity context 对象并传递Activity 的子对象(即Main_Screen),它称为向上转换(Implicit Casting)。

    所以Activity(作为父级)没有doSth() 的方法。所以你需要向下转换(显式转换)来使其成为Main_Screen

    有两种方法可以做到这一点。

    创建一个Main_Screen context 的对象,而不是Activity context

    tryIt() 方法中将其转换为Main_Screen 以利用Main_Screen 这样的方法:

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

    你也可以使用try catch来减少ClassCastException的机会

    【讨论】:

      【解决方案3】:

      您可以使用以下代码。显然类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();
              }
          }
      

      【讨论】:

      • 我认为当应用程序运行时它会创建一个 Main_screen 实例,它有一个方法 doSth()。因此,当我将“this”传递给创建的 My_ArrayAdapter 时,我就有了带有实例方法的实例。您的建议是调用 Main_screen 的类方法 - 不幸的是,它不起作用,因为没有类方法 doSth。不过谢谢你的建议!
      • 我只是在发布答案后才注意到您的代表。如果我以前回答过,我就不敢回答了。我现在好尴尬。哈哈。编码愉快。
      【解决方案4】:

      我是怎么做到的

      StaticCommonDataClass -> 这里维护的是静态数据,我会把Activity一的实例保存在里面。

      ActivityOneClass -> 包含我必须在 ActivityTwo 中实际访问的方法。

      ActivityTwoClass => 将访问 ActivityOne 方法。

      我讨厌将两个多参数从一个函数传递给另一个函数或一个类传递给另一个类, 当必须一次又一次地为相似的值完成时,也是如此。

      这里我将 ActivityOneClass 的引用 存储在 static 变量中。

      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
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-03
        • 1970-01-01
        • 1970-01-01
        • 2013-08-20
        • 2012-12-28
        • 1970-01-01
        相关资源
        最近更新 更多