2017-01-04 2 views
1

나는 이것이 아마도 연구의 부족으로 인해 여기에 묻는 질문 중 가장 좋은 유형이 아니라는 것을 알고 있지만, 실제로 여기서 어디서부터 시작해야할지 전혀 알지 못합니다. 모든 것이 제대로 작동해야합니다. 어쨌든 UI를 적절하게 적용하고 모든 화면에 완벽하게 적응할 수 있도록 프로그래밍 방식으로 몇 가지 버튼을 앱 UI에 추가하려고합니다.프로그래밍 방식으로 상대적 레이아웃에 버튼 추가

And this is what I'm getting.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    layout = (RelativeLayout) findViewById(R.id.activity_main); 
    Point size = new Point(); 
    Display display = getWindowManager().getDefaultDisplay(); 
    display.getRealSize(size); 
    params = new RelativeLayout.LayoutParams(size.x/5, 200); 
    padding = size.x/5; 
    addButtons(); 
} 

public void addButtons() { 
    Button update = new Button(this); 
    RelativeLayout.LayoutParams updateParams = params; 
    updateParams.addRule(RelativeLayout.CENTER_VERTICAL); 
    update.setLayoutParams(updateParams); 
    update.setPadding(padding, 0, 0, 0); 
    update.setText("Update Me!"); 
    update.setOnClickListener(new ClickHandler("app_update")); 
    updateId = update.generateViewId(); 
    update.setId(updateId); 
    layout.addView(update); 

    Button install = new Button(this); 
    RelativeLayout.LayoutParams installParams = params; 
    installParams.addRule(RelativeLayout.RIGHT_OF, update.getId()); 
    installParams.addRule(RelativeLayout.CENTER_VERTICAL); 
    install.setLayoutParams(installParams); 
    install.setPadding(padding, 0, 0, 0); 
    install.setText("Install LastBox"); 
    install.setOnClickListener(new ClickHandler("kodi_install")); 
    installId = install.generateViewId(); 
    install.setId(installId); 
    layout.addView(install); 

    Button dlFamily = new Button(this); 
    RelativeLayout.LayoutParams dlFamilyParams = params; 
    dlFamilyParams.addRule(RelativeLayout.RIGHT_OF, install.getId()); 
    dlFamilyParams.addRule(RelativeLayout.ABOVE, install.getId()); 
    dlFamily.setLayoutParams(dlFamilyParams); 
    dlFamily.setPadding(padding, 0, 0, padding); 
    dlFamily.setText("Download Family Build"); 
    dlFamily.setOnClickListener(new ClickHandler("family_download")); 
    dlFamilyId = dlFamily.generateViewId(); 
    dlFamily.setId(dlFamilyId); 
    layout.addView(dlFamily); 

    Button upFamily = new Button(this); 
    RelativeLayout.LayoutParams upFamilyParams = params; 
    upFamilyParams.addRule(RelativeLayout.RIGHT_OF, install.getId()); 
    upFamilyParams.addRule(RelativeLayout.BELOW, install.getId()); 
    upFamily.setLayoutParams(upFamilyParams); 
    upFamily.setPadding(padding, padding, 0, 0); 
    upFamily.setText("Update Family Build"); 
    upFamily.setOnClickListener(new ClickHandler("family_update")); 
    upFamilyId = upFamily.generateViewId(); 
    upFamily.setId(upFamilyId); 
    layout.addView(upFamily); 

    Button dlAdult = new Button(this); 
    RelativeLayout.LayoutParams dlAdultParams = params; 
    dlAdultParams.addRule(RelativeLayout.RIGHT_OF, dlFamily.getId()); 
    dlAdultParams.addRule(RelativeLayout.ABOVE, install.getId()); 
    dlAdult.setLayoutParams(dlAdultParams); 
    dlAdult.setPadding(padding, 0, 0, padding); 
    dlAdult.setText("Download Adult Build"); 
    dlAdult.setOnClickListener(new ClickHandler("adult_download")); 
    dlAdultId = dlAdult.generateViewId(); 
    dlAdult.setId(dlAdultId); 
    layout.addView(dlAdult); 

    Button upAdult = new Button(this); 
    RelativeLayout.LayoutParams upAdultParams = params; 
    upAdultParams.addRule(RelativeLayout.RIGHT_OF, upFamily.getId()); 
    upAdultParams.addRule(RelativeLayout.BELOW, install.getId()); 
    upAdult.setLayoutParams(upAdultParams); 
    upAdult.setPadding(padding, padding, 0, 0); 
    upAdult.setText("Update Adult Build"); 
    upAdult.setOnClickListener(new ClickHandler("adult_update")); 
    upAdultId = upAdult.generateViewId(); 
    upAdult.setId(upAdultId); 
    layout.addView(upAdult); 
} 

Here is a very rough idea of the format I'm needing (with text in each button of course) 나는 심지어 마법 "내가 너무 게으른이기 때문에 나를 위해 그것을 해결"솔루션을 찾는 게 아니에요. 올바른 방향으로 나를 가리키며, 내가 볼 필요가있는 곳을 보여주세요. 나는이 문제들을 해결하는 것을 즐긴다. 그러나 올바른 자리에서 시작하는 것은 놀라운 일이다.

답변

0

모든 버튼에 동일한 RelativeLayout.LayoutParams params을 사용하고 있습니다. 자바에서는 모든 비 기본 유형의 할당은 참조에 의해 만들어진, 그래서 당신은

RelativeLayout.LayoutParams updateParams = params; 
RelativeLayout.LayoutParams installParams = params; 
RelativeLayout.LayoutParams dlFamilyParams = params; 

등, 다양한 변수 메모리에서 같은 객체를 할당하는 작업을 수행 할 때. 변수는 특정 메모리 주소에 대한 텍스트 참조 일 뿐이므로 다른 이름을 사용하면 항상 메모리의 동일한 객체를 참조합니다.

각 단추마다 다른 레이아웃 매개 변수 속성을 설정하여보기에 배치 할 수 있습니다. 그러나 메모리에있는 동일한 객체를 항상 참조하고 있다고 말하면 항상 동일한 객체를 업데이트하므로 이전 설정을 무시하고 마지막 설정 만 유지합니다.

따라서 모든 버튼에 동일한 params 객체를 설정하고 있습니다.

이러한 오류의 조합으로 인해 자신의 설정이있는 모든 RelativeLayout.LayoutParams를 가진 모든 버튼을 갖게되고, 다른 버튼 위에 하나씩 배치되고 마지막으로 추가 된 것만 볼 수 있습니다. 다음과 같은

은 각 버튼에 대해 다른 PARAMS 객체를 생성 할 수 있습니다

RelativeLayout.LayoutParams updateParams = new RelativeLayout.LayoutParams(size.x/5, 200); 
... 
RelativeLayout.LayoutParams installParams = new RelativeLayout.LayoutParams(size.x/5, 200); 
... 

이보기 나는 당신이 메뉴의 도구로 접근 레이아웃 검사기 도구를 사용하는 것이 좋습니다 문제 분석하기 -> 안드로이드

+0

답장을 보내 주셔서 감사합니다. 이것은 트릭을했다. 저는 C++에 가장 익숙했습니다. 따라서 Java에서 가장 많은 변수가 참조임을 발견하는 것이 이상했습니다! 매혹적인. 어쨌든, 각 단추에 내 setText 메서드가 있음에도 불구하고 단추에는 텍스트가 없습니다. 어떤 생각? –

0

시도 이

RelativeLayout layout = (RelativeLayout)findViewById(R.id.activity_main); 
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 


for (int i=0; i<10; i++) { 
    Button button= new Button(this); 
    button.setText("some_text"); 
    button.setId(i); 

    // lp.addRule(RelativeLayout.RIGHT_OF, <Id>); 

    layout.addView(tv2, lp); 
} 
관련 문제