Добавить кнопку в макет программно
У меня возникли проблемы с добавлением кнопки в макет, который я создал в 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
. Есть идеи? Еще раз спасибо
Ответы
Ответ 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);