2011-02-05 9 views
31

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

Любая помощь будет оценена. Благодаря

EDIT # 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) 

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

+1

показать нам, что вы пробовали и LogCat вы получите, что работает, поэтому мы пытаемся выяснить, почему вы получите NPE в любом случае рассмотреть вопрос о создании 'макета screen_temperature.xml' и использования, что в 'setContentView()'. вы можете добавить в xml свой пользовательский вид, указав весь пакет, а не просто имя (например: '') – bigstones

+0

создать линейный макет (11) и добавить GraphTemp отображает объект и объект кнопки в ll. Затем установите для содержимого представление активности значение ll. т.е. setContentView (11); – bhups

ответ

31

Эта линия:

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

Похоже на "statsviewlayout" идентификатор в текущем 'contentview'. Теперь вы установили, что здесь:

setContentView(new GraphTemperature(getApplicationContext())); 

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

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

NullPointer будет отброшена, так как макет вы ищете, не найден, так

layout.addView(buyButton); 

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

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

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

, предполагая, что у вас есть LinearLayout в файле под названием «yourXMLYouWantToLoad.XML»

+0

Не могли бы вы взглянуть на мое второе редактирование? Я отправил его в то же самое время, когда вы отправили этот ответ. Я не слишком уверен, что понимаю. Макет «statsviewlayout» объявлен в xml, если это то, о чем вы спрашиваете? – mmmbaileys

+0

Хорошо сразу посмотрев ваше дополнение там. Я бы сказал, что хот :-) спасибо – mmmbaileys

+0

Вы, кажется, делаете это еще: 'layout = (LinearLayout) findViewById (R.id.statsviewlayout);' Пока ваше, из-за отсутствия лучшего слова, текущий вид на (то, что вы установили в 'setcontentview', не содержит этого идентификатора, вы не можете этого сделать. Пока xml, который содержит 'statsviewlayout', не устанавливается с помощью' setcontentview', 'findviewbyid' вернет 'null' – Nanne

31

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

FILL_PARENT устарел, переименован в MATCH_PARENT в API уровня 8 и выше. – GregD

+0

@GregD thx для информации! –

Смежные вопросы