используйте getApplicationContext для получения другого контекста действия

#android #android-activity #android-context

#Android #android-activity #android-context

Вопрос:

Я хотел бы получить Context другое действие, в котором я создал объект (адаптер, содержащий список объектов, которые мне нужно отобразить во втором действии).

 public class Activity1 extends Activity {

    private Context context = this;

    private GridView gridView;
    private MyAdapter myAdapter;            

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.myLayout);

        myAdapter = new MyAdapter(context);

        gridView = (GridView) findViewById(R.id.mylayout2);
        gridView.setAdapter(myAdapter);
}

public class Activity2 extends Activity {

Context context = this;

private MyAdapter myAdapter;
private GridView gridView;

@Override
public void onCreate(Bundle savedInstanceState) {         
   super.onCreate(savedInstanceState);    
   setContentView(R.layout.mylayout3);

   //what I want to do
   cardAdapter = new CardAdapter(manageCardContext); //I want this adapter to be the one in Activity1
   gridView.setAdapter(myAdapter);
}
  

Как я могу это сделать?

Комментарии:

1. очень маловероятно, что вам нужен контекст другого действия. это похоже на проблему XY meta.stackexchange.com/questions/66377/what-is-the-xy-problem

2. Что вы пытаетесь сделать в Activity2 с контекстом Activity1 (я понимаю, что вы отображаете список объектов в A2, но какое это имеет отношение к A1?)?

3. @SamusArin Я создал адаптер в Activity1, который содержит список объектов. С помощью адаптера я могу отобразить список объектов, но мне нужно отобразить их в Activity2. Вот почему я подумал о получении контекста Activity1, чтобы я мог передать его конструктору адаптера в Activity2

4. этот вопрос, вероятно, был отклонен, потому что он неясен. Вместо того чтобы спрашивать, как найти решение проблемы, которая не объяснена, попробуйте написать свой вопрос, объясняющий, чего вы пытаетесь достичь.

5. @akari это сработало бы, если бы вы сделали список объектов общедоступным (или создали для него средство доступа), а затем преобразовали контекст из A2 в A1 и ссылались на этот общедоступный элемент… (хотя я не рекомендую это, так как это анемично) В A2.onCreate() список действий<объект> lo = ((A1)контекст).getObectList();

Ответ №1:

Я создал адаптер в Activity1, который содержит список объектов.

Создавайте только Adapter в том действии, которое будет использовать Adapter , и используйте только это Adapter в этом действии.

С помощью адаптера я могу отобразить список объектов, но мне нужно отобразить их в Activity2

Затем переместите код создания адаптера из Activity1 в Activity2. Или, если вам нужен один и тот же адаптер в обоих местах, скопируйте код или сделайте так, чтобы оба действия наследовались от некоторого базового класса, в котором есть код создания адаптера.

Комментарии:

1. На самом деле оба действия используют адаптер. Они оба отображают список объектов, но я хочу, чтобы объекты, созданные и отображаемые в Activity1, отображались в Activity2, потому что объекты не создаются в Activity2

2. @akari Я бы сказал, просто воссоздайте объекты в activity2, скорее всего, не стоит просто сохранять от повторного создания экземпляра.

3. @akari: «На самом деле оба действия используют адаптер» — самое большее, они могут использовать один и тот же класс адаптера. Они не могут и не должны использовать один и тот же экземпляр адаптера. «поскольку объекты не создаются в Activity2» — какими бы ни были эти объекты, они должны быть доступны из обоих действий, чтобы они могли создавать свои собственные адаптеры. Или не используйте отдельные действия (например, используйте фрагменты в одном действии).

4. @akari Я использую шаблон MVC, и каждое представление (включая фрагменты) получает свою собственную модель представления, которая инициализируется и заполняется соответствующими контроллерами. Я никогда не разделяю ссылки между представлениями, они являются их собственной сущностью и получают свои собственные объекты / коллекции / ссылки, это сделает ваш код намного более модульным.

5. Хорошо, я буду создавать объекты в Activity2, как вы предложили CommonsWare

Ответ №2:

Аналогично предложению CommonsWare, я определил общедоступный класс адаптера вне действия, просто в файле класса (извините, это код на C #, но вы должны понять, если вы уже написали свой адаптер)

CommonAdapter.java

 public class CommonAdapter : ArrayAdapter<AttachmentDetails>
{
    private readonly List<AttachmentDetails> _attachments;

    public CommonAdapter( Context context, List<AttachmentDetails> attachments )
        : base( context, 0, attachments )
    {       
        _attachments = attachments;
    }

    public override View GetView( int position, View convertView, ViewGroup parent )
    {
        ...
    }
}
  

и создавайте экземпляр везде, где мне это нужно

 _recordAttachmentsGrid.Adapter = new CommonAdapter(this.ApplicationContext, Model.Attachments);