доступ к методу вызывающего действия из созданного им объекта - PullRequest
1 голос
/ 08 декабря 2011

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.И из этого экземпляра я хотел бы получить доступ к методу вызывающего.

Почему это невозможно?

Большое спасибо!

Ответы [ 4 ]

5 голосов
/ 08 декабря 2011

попробуйте это:

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

context - это Activity, и у него нет doSth (), но есть Main_screen, поэтому вы должны привести к этому классу

1 голос
/ 08 декабря 2011

На самом деле вы создаете Activity context объект и передаете дочерний элемент Activity (то есть Main_Screen), который называется восходящим приведением ( Неявное приведение ).

Таким образом, 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 голосов
/ 29 мая 2013

Как я это сделал

StaticCommonDataClass -> здесь хранятся статические данные, я буду хранить экземпляр Activity номер один.

ActivityOneClass -> Содержит метод, к которому я должен обратиться в ActivityTwo.

ActivityTwoClass => Доступ к методу ActivityOne.

То, что я ненавижу, это передавать два параметра из одной функции в другую функцию или из одного класса в другой класс, это также, когда это должно быть сделано для подобных значений снова и снова.

Здесь я буду хранить ссылку ActivityOneClass в static Variable.

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
    }
}
0 голосов
/ 08 декабря 2011

Вы можете использовать приведенный ниже код.Очевидно, класс 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();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...