Добавить кнопку в макет программно - PullRequest
33 голосов
/ 05 февраля 2011

У меня проблемы с добавлением кнопки в макет, который я создал в XML.Вот чего я хочу добиться:

//some class
else {
        startActivity(new Intent(StatisticsScreen.this, ScreenTemperature.class));
}
////

//ScreenTemperatureClass
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //this is where I call another class that
    //displays a nice graph
    setContentView(new GraphTemperature(getApplicationContext()));

}

Я хочу добавить Button к этому новому экрану, чтобы он отображался под графиком.Я попытался создать представление LinearLayout, затем создать Button и добавить его в это представление, но я просто получаю NullPointerException s ..

Любая помощь будет принята с благодарностью.Спасибо

РЕДАКТИРОВАТЬ # 1

Вот то, что я пытался использовать для создания NullPointerException и 'принудительного закрытия':

Button buybutton;
LinearLayout layout;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(new GraphTemperature(getApplicationContext()));

    layout = (LinearLayout) findViewById(R.id.statsviewlayout);
    Button buyButton = new Button(this);
    buyButton.setText(R.string.button_back);
    buyButton.setLayoutParams(new LayoutParams(
        ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT));
    layout.addView(buyButton);

}

А вот ошибка logcat:

ERROR/AndroidRuntime(293): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.weatherapp/com.weatherapp.ScreenTemperature}: java.lang.NullPointerException
ERROR/AndroidRuntime(293):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
ERROR/AndroidRuntime(293):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
ERROR/AndroidRuntime(293):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
ERROR/AndroidRuntime(293):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)

очевидно, что в logcat есть больше строк, чтобы сделать с этой ошибкой, не уверен, если вы хотите?

EDIT # 2

Итак, я попробовал метод bhups:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GraphTemperature GT = new GraphTemperature(getApplicationContext());             
    layout = (LinearLayout) findViewById(R.id.statsviewlayout);
    Button buyButton = new Button(this);
    buyButton.setText(R.string.button_back);
    buyButton.setLayoutParams(new LayoutParams(
        ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT));
    layout.addView(GT); // line 27
    layout.addView(buyButton);       
    setContentView(layout);           
}

Этот метод выдал ту же ошибку logcat, что и выше, NullPointerException, указывая, что это было связано со строкой №.27, которая является строкой кода layout.addView.Есть идеи?Еще раз спасибо

Ответы [ 2 ]

33 голосов
/ 16 декабря 2012

Если вы просто включили файл макета в начале onCreate() внутри setContentView и хотите, чтобы этот макет добавлял новые элементы программным способом, попробуйте следующее:

ViewGroup linearLayout = (ViewGroup) findViewById(R.id.linearLayoutID);

тогда вы можете создать новый Button, например, и просто добавить его:

Button bt = new Button(this);
bt.setText("A Button");
bt.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
                                    LayoutParams.WRAP_CONTENT));
linerLayout.addView(bt);
31 голосов
/ 05 февраля 2011

Эта строка:

layout = (LinearLayout) findViewById(R.id.statsviewlayout);

Ищет идентификатор «statsviewlayout» в вашем текущем «contentview».Теперь вы установили это здесь:

setContentView(new GraphTemperature(getApplicationContext()));

И я предполагаю, что новый "graphTemperamer" ничего не устанавливает с этим идентификатором.

Это распространенная ошибка, что вы можете простонайти любой вид с помощью findViewById.Вы можете найти только представление, которое находится в XML (или назначено кодом и ему присвоен идентификатор).

Нулевой указатель будет сгенерирован, потому что искомый макет не найден, поэтому

layout.addView(buyButton);

Выдает это исключение.

добавление: теперь, если вы хотите получить это представление из XML, вы должны использовать инфлятор:

layout = (LinearLayout) View.inflate(this, R.layout.yourXMLYouWantToLoad, null);

, если у вас естьlinearlayout в файле с именем "yourXMLYouWantToLoad.xml"

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