#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