Невозможно получить доступ к моему пользовательскому объекту представления из другого класса

Я уже давно пытаюсь найти решение своей проблемы, но безрезультатно. У меня есть класс customView, который я добавляю статически в layout моего MainActivity (я добавляю его в файл XML). У меня есть второй Activity, которому нужен доступ к методам моего customView, так как он будет извлекать из него данные и изменять некоторые данные. Однако моему второму activity нужно получить доступ только к тому же объекту пользовательского представления, которое уже было добавлено в MainActivity.

Я хочу, чтобы это выглядело примерно так:

В своем MainActivity.java я бы сделал так:

public class MainActivity extends AppCompatActivity {


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

    Button btn = (Button) findViewById(R.id.btnID);


    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Intent btnIntent = new Intent(MainActivity.this, SecondActivity.class);
            startActivity(btnIntent);
        }
    });


}   

А в моем SecondActivity это будет примерно так:

public class SecondActivity extends AppCompatActivity {


 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);


 CustomView viewer = (CustomView) findViewById(R.id.custom); //I want to link to the view I added in the MainActivity

 viewer.getData(); // Example of what methods I want to use here
 viewer.setData(); // It should directly set/get the data from the object in the MainActivity

До сих пор я пробовал это:

public static CustomView viewer = (CustomView) findViewById(R.id.custom);

В MainActivity, чтобы затем использовать viewer в SecondActivity, но это не сработало, потому что findViewById не является статическим.

Я также попытался добавить это:

CustomView viewer = (CustomView) ((Activity)context).findViewById(R.id.custom);

В SecondActivity, но тогда я получаю сообщение об ошибке, что я вызываю findViewById для нулевой ссылки.

Я не совсем уверен, что я могу сделать, я много искал в Интернете и в SO, но до сих пор не могу решить проблему.

Я все еще новичок в андроиде, поэтому буду признателен, если кому-то удастся мне помочь.

Спасибо!


person Mostafa Abdulrazic    schedule 21.10.2017    source источник


Ответы (4)


Таким образом, вы можете отправить свои дополнения в другую активность из ClassA:

Intent intent = new Intent(ClassA.this, ClassB.class);
            intent.putExtra("A", "A");
            startActivity(intent);

И получить его в классе B:

Intent intent = getIntent();
Bundle extras = intent.getExtras();

if (extras != null) {
    if (extras.containsKey("A")) {
        //do your stuff
    }
}
person Stanojkovic    schedule 21.10.2017
comment
Ваш метод работает, но у меня возникла проблема с передачей значения типа данных Paint.Cap . Я не могу получить этот тип данных в другой своей деятельности. Есть идеи? - person Mostafa Abdulrazic; 21.10.2017
comment
Вы передаете Bitmap другому действию? - person Stanojkovic; 21.10.2017
comment
Нет, я прохожу Paint.Cap - person Mostafa Abdulrazic; 21.10.2017
comment
Попробуйте что-то вроде этого: intent.putExtra("Cap.BUTT", "Cap.BUTT"); - person Stanojkovic; 21.10.2017
comment
Я смог передать его в намерении, но не могу получить во втором действии. - person Mostafa Abdulrazic; 21.10.2017

Вы не можете получить доступ к views из firstActivity в secondActivity. Лучшим способом будет передача данных в secondActivity с использованием метода intent.putExtra(). Если вам нужен результат обратно в firstActivity, вы можете использовать метод startActivityForResult(), чтобы вернуть result обратно в firstActivity.

person Sangeet Suresh    schedule 21.10.2017
comment
@MostafaOsama см. это - person FarshidABZ; 21.10.2017
comment
см. stackoverflow.com/questions/4114443/ для отправки данных см. stackoverflow.com/questions/10407159/ для получения результата - person Sangeet Suresh; 21.10.2017

Плохой подход — но ваш код работает

Вы пытались использовать

 public static CustomView viewer = (CustomView) findViewById(R.id.custom);

в MainActivity. Вы можете заставить его работать, разделив приведенный выше оператор на две части, предполагая, что вы начинаете SecondActivity после MainActivity. Сначала определите переменную и инициализируйте ее в onCreate MainActivity после вызова setContentView следующим образом:

public class MainActivity extends AppCompatActivity {
public static CustomView viewer;

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

    viewer = (CustomView) findViewById(R.id.custom);

    Button btn = (Button) findViewById(R.id.btnID);


    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Intent btnIntent = new Intent(MainActivity.this, SecondActivity.class);
            startActivity(btnIntent);
        }
    });


}   

Сейчас в SecondActivity

public class SecondActivity extends AppCompatActivity {


 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);



 MainActivity.viewer.getData(); // Example of what methods I want to use here
 MainActivity.viewer.setData(); // It should directly set/get the data from the object in the MainActivity
}

Ваш код не работает, поскольку макет CustomView из MainActivity недоступен до setContentView.

Хороший подход

Представления содержат Context и Контекст не следует помещать в статические поля, так как они провоцируют утечку памяти. Как предполагают другие ответы, вы должны получить все данные из вашего CustomView в самом MainActivity, а затем передать их в SecondActivity через Intent.

person Birendra Singh    schedule 21.10.2017

Вы не можете ссылаться на view через activities. Вам нужно иметь customView с идентификатором R.id.custom в макетах R.layout.activity_second и R.layout.activity_main.

Вы можете думать о Activity как о классе, который управляет тем, что рисуется на экране. Когда вы запускаете SecondActivity, он по существу перерисовывает то, что ваш MainActivity создал с помощью R.layout.activity_main.

Кроме того, если вы не хотите идти по пути Intent, как предлагают другие ответы, один из способов ссылки на один и тот же объект в разных действиях - сохранить его в приложении Context. Таким образом, вы можете иметь что-то вроде:

  1. Создайте одноэлементный класс CustomViewManager
  2. Создайте экземпляр объекта CustomViewManager в своем классе приложения.
  3. В вашем MainActivity перед вызовом метода startActivity: установите значения от customview до CustomViewManager объекта.
  4. В вашем SecondActivity обратитесь к CustomViewManager, чтобы получить/установить значения вашего customview.
person Amit Barjatya    schedule 21.10.2017