findViewById () работает в одном действии, но не в другом - PullRequest
2 голосов
/ 25 октября 2011

Я пытаюсь передать 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);отлично работает в Деятельности 1 , но не работает в Деятельности 2.

РЕДАКТИРОВАТЬ:

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

Ответы [ 5 ]

6 голосов
/ 25 октября 2011

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

0 голосов
/ 25 октября 2011

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

0 голосов
/ 25 октября 2011

Похоже, вы пытаетесь получить идентификатор 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)

0 голосов
/ 25 октября 2011

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

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

0 голосов
/ 25 октября 2011

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

...