web-dev-qa-db-ja.com

プログラムでレイアウトにボタンを追加する

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を作成してこのビューに追加しようとしましたが、NullPointerExceptionsを取得するだけです。

任意の助けをいただければ幸いです。ありがとう

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

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コード行。何か案は?再度、感謝します

34
mmmbaileys

この行:

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

現在の「contentview」で「statsviewlayout」IDを探します。ここで設定しました:

setContentView(new GraphTemperature(getApplicationContext()));

そして、新しい「graphTemperature」はそのIDで何も設定しないと推測しています。

FindViewByIdで任意のビューを見つけることができると考えるのはよくある間違いです。 XMLにある(またはコードで指定され、IDが指定された)ビューのみを見つけることができます。

探しているレイアウトが見つからないため、nullpointerがスローされます。

layout.addView(buyButton);

その例外をスローします。

さらに:XMLからそのビューを取得する場合は、インフレータを使用する必要があります。

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

「yourXMLYouWantToLoad.xml」というファイルにlinearlayoutがあると仮定します

32
Nanne

setContentView内のonCreate()の先頭にレイアウトファイルを含め、プログラムで新しい要素を追加するためにこのレイアウトを取得したい場合は、これを試してください。

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);
33
Alex Cio