Функция findViewById() работает в одном действии, но не в другом

#android #android-edittext #nullreferenceexception #android-view #findviewbyid

#Android #android-edittext #исключение nullreferenceexception #android-просмотр #findviewbyid

Вопрос:

Я пытаюсь передать EditText из Activity1 в Activity2.

Код Activity1:

 public void openNextActivity() 
{
    Intent intent = new Intent("com.abc.xyz.ImageActivity"); 
    EditText myEditText = (EditText)findViewById(R.id.myEditText);

    int myEditTextId = myEditText.getId();
    //For Test purpose ----- starts
    // **Point1: next line of code works fine in this Activity1**
    EditText myEditTextTest = (EditText)findViewById(myEditTextId); 
    //For Test purpose ----- ends   

    intent.putExtra("myEditText", myEditTextId);

    startActivity(intent); 
}
 

Код Activity2:

 public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.comments_detail);

    Bundle extras = getIntent().getExtras();
    if(extras != null)
    {
        int myEditTextId = extras.getInt("myEditText");

        // Point2: next line of code displays the correct Id
        Log.d("tag","myEditTextId"  myEditTextId);

        // Point 3: Next line of code not works in this Activity2
        EditText myEditText = (EditText)findViewById(myEditTextId);

        if(myEditText != null)
        {
            Log.d("tag","Not null");
        }
        else
        {
            Log.d("tag","null");// **Point4: this condition executes**
        }
    }
}
 

Проблема в том, что строка: EditText myEditText = (EditText)findViewById(myEditTextId); отлично работает в Activity1, но не работает в Activity2.

Редактировать:

Примечание: в обоих действиях используются разные макеты Спасибо за ваше драгоценное время и помощь.

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

1. Если оба действия используют тот же макет, что и setContentView(), то это должно сработать. Спасибо

Ответ №1:

Единственные доступные вам представления — это те, которые находятся в макете, который вы загрузили в начале действия 2, то есть в R.layout.comments_detail. Я предполагаю, что действие 1 загружает другой макет с его setContentView(..), и именно в этом макете определен ‘myEditText и находится в области видимости.

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

1. Спасибо @NickT, вы правы, в обоих действиях используются разные макеты.

Ответ №2:

Вы не можете передать представление как дополнительное. Вы можете передать строку в представлении (если это ваша цель).

Ответ №3:

Похоже, вы пытаетесь получить EditText идентификатор до того, как он был назначен:

 int myEditTextId = myEditText.getId();
EditText myEditText = (EditText)findViewById(myEditTextId); **// Point1: Works fine**
 

Попробуйте это вместо:

 EditText myEditText = (EditText)findViewById(myEditTextId); **// Point1: Works fine**
int myEditTextId = myEditText.getId();
 

Редактировать

Существует ли рассматриваемое EditText даже в заданном макете? (R.layout.comments_detail)

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

1. С другой стороны, если вы получаете правильный идентификатор во втором действии, это не должно быть проблемой. Однако ваш код в первом действии немного вводит в заблуждение 🙂

2. Спасибо @michell назад, я обновил вопрос, надеюсь, теперь он ясен.

Ответ №4:

Это невозможно сделать.

Если ваша попытка состоит в том, чтобы манипулировать действием 1 из действия 2, тогда вы должны возвращать что-то в действие 1 из действия 2. Передача идентификатора представления, который вы сделали в действии 1, в действие 2 не должна разрешаться ни к чему из-за того, что в действии 2 ничего не создается. findViewById вызывается для текущего действия. Поскольку вы ничего не установили в представлении, ему нечего искать.

Ответ №5:

Я думаю, это может сработать, если вы используете один и тот же макет R.layout.comments_detail в Activity1 и Activity2, потому что findViewById() возвращает уникальный идентификатор, и этот идентификатор принадлежит только layout comments_detail