Подтвердить что ты не робот

Добавить кнопку в макет программно

У меня возникли проблемы с добавлением кнопки в макет, который я создал в 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 и "force close":

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)

theres, очевидно, больше строк, связанных с этой ошибкой в ​​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, что указывает на то, что это связано с линией no. 27, который является строкой кода layout.addView. Есть идеи? Еще раз спасибо

4b9b3361

Ответ 1

Эта строка:

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

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

setContentView(new GraphTemperature(getApplicationContext()));

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

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

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

layout.addView(buyButton);

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

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

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

предполагая, что у вас есть ваш linearlayout в файле с именем yourXMLYouWantToLoad.xml

Ответ 2

Если вы только что включили файл макета в начале 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);