android - 레이아웃 - 안드로이드 getlayoutparams



프로그래밍 방식으로 레이아웃에 버튼 추가 (2)

이 행 :

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

현재 'contentview'에있는 "statsviewlayout"ID를 찾습니다. 이제 여기에 설정했습니다.

setContentView(new GraphTemperature(getApplicationContext()));

그리고 저는 그 새로운 "graphTemperature"가 그 id로 아무 것도 설정하지 않는다고 생각합니다.

findViewById를 사용하여 모든 뷰를 찾을 수 있다고 생각하는 것은 일반적인 실수입니다. XML에 있거나 (코드에 의해 지정되고 ID가 지정된)보기 만 찾을 수 있습니다.

찾고있는 레이아웃이 없기 때문에 널 포인터가 던져 질 것이다.

layout.addView(buyButton);

그 예외를 던집니다.

추가 : 이제 XML에서 해당 뷰를 가져 오려면 인플레이터를 사용해야합니다.

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

"yourXMLYouWantToLoad.xml"파일에 선형 레이아웃을 가지고 있다고 가정하면,

https://src-bin.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 뷰를 만든 다음 ButtonLinearLayout 뷰에 추가했지만 NullPointerException 얻었습니다.

어떤 도움을 주시면 감사하겠습니다. 감사

# 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 코드 줄입니다. 어떤 아이디어? 다시 한 번 감사드립니다.


Answer #1

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);




android-activity