Всякий раз, когда я создаю новую кнопку, мое приложение закрывается - PullRequest
0 голосов
/ 27 декабря 2011
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.RelativeLayout;

public class register_activity extends Activity {


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

        RelativeLayout RLayout = (RelativeLayout) View.inflate(this, R.layout.register, null);

        RelativeLayout.LayoutParams p = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.FILL_PARENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT
        );

        Button btnCreateNew = new Button(this);
        btnCreateNew.setText("Create New User");
        btnCreateNew.offsetTopAndBottom(10);
        btnCreateNew.offsetLeftAndRight(10);
        RLayout.addView(btnCreateNew, p);

    }
}

Так что код работает и работает просто отлично, только я не вижу отображаемой кнопки. Макет просто пустой, внутри ничего нет.

Что не так?

Ответы [ 5 ]

1 голос
/ 27 декабря 2011

Вы получили исключение NullPointerException, верно? (Проверьте свой LogCat!)

Причина:

  1. Вы создаете Button как переменную-член с this в качестве параметра. Это может вызвать некоторые проблемы, так как this может не быть определено при вызове new Button(this). Переместите инициализацию в onCreate

  2. Ваш RLayout будет нулевым, и здесь я очень уверен. Причина в том, что вы не можете позвонить findViewById(), прежде чем позвонить setContentView(). Если вы вызываете его раньше, Android не знает, где искать, и возвращает ноль.

обновление

Поскольку вы немного изменили свой вопрос, вот мой обновленный ответ:

Вы устанавливаете свой контент на R.layout.register и после этого снова его раздувает.

Мое решение для вас: просто используйте setContentView(R.layout.register), затем используйте findViewById(R.id.layout_id) и, наконец, создайте и добавьте свою кнопку:

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

    RelativeLayout RLayout = (RelativeLayout) findViewById(R.id.layout_id);

    RelativeLayout.LayoutParams p = new RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams.FILL_PARENT,
            RelativeLayout.LayoutParams.WRAP_CONTENT
    );

    Button btnCreateNew = new Button(this);
    btnCreateNew.setText("Create New User");
    btnCreateNew.offsetTopAndBottom(10);
    btnCreateNew.offsetLeftAndRight(10);
    RLayout.addView(btnCreateNew, p);
}

Конечно, вы также можете добавить кнопку непосредственно в макет XML. Я бы предпочел этот способ, потому что у вас есть лучшее разделение между макетом и кодом.

Базовая структура XML (стиль, который вы хотите):

<RelativeLayout android:id="@+id/layout_id"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <Button android:id="@+id/button_id"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:text="@string/button_text"/>
</RelativeLayout>

Причиной появления пустого экрана было то, что вы добавили кнопку в новый созданный RLayout, но этот макет никогда не был частью вашего экрана (никогда не добавлялся setContentView())

0 голосов
/ 27 декабря 2011
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.RelativeLayout;

public class register_activity extends Activity {
Button btnCreateNew;

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

        RelativeLayout RLayout = (RelativeLayout) View.inflate(this, R.layout.register, null);

        RelativeLayout.LayoutParams p = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.FILL_PARENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT
        );

        btnCreateNew = new Button(this);
        btnCreateNew.setText("Create New User");
        btnCreateNew.offsetTopAndBottom(10);
        btnCreateNew.offsetLeftAndRight(10);
        RLayout.addView(btnCreateNew, p);
        setContentView(RLayout);
    }
}

В конце концов, все, что мне нужно было сделать, это переустановить contentView; Я подумал, что это должно быть какое-то обновление вида.

Высокий ! Спасибо всем:)

0 голосов
/ 27 декабря 2011

Попробуйте это

public class register_activity extends Activity {

Button btnCreateNew;

@Override
public void onCreate(Bundle savedInstanceState) {
btnCreateNew = new Button(R.layout.register);
}

Это должно работать. Вы не указываете, из какого xml должна быть извлечена кнопка.

0 голосов
/ 27 декабря 2011

Существует разница между this и getApplicationContext(), попробуйте изменить это на getApplicationContext().

0 голосов
/ 27 декабря 2011

Может быть, вы могли бы попробовать перестроить свои строки кодов.В основном классе измените Button btnCreateNew = new Button(this); на Button btnCreateNew; Или просто переместите всю строку в onCreate().Что говорит ваша ошибка в вашем logcat?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...