2010-05-29 2 views
2

내가 setContentView (boardView)를 주석 처리 할 때; 내 Game.java에서 BoardView의 내 사용자 정의보기가 잘 작동하고 멋지게 표시됩니다 ... 그러나 onSizeChanged는 BoardView.java에서 호출되지 않습니다 ... 그래서 런타임시 장치 너비와 높이를 읽을 수 없습니다. 내가 setContentView 주석 처리되지 않은 onSizeChanged 작품을 떠날 경우 ...하지만 화면이 비어 있습니다!내 사용자 정의보기가 나타나지 않는 이유는 무엇입니까?

런타임시 화면 너비와 높이를 읽고 최적의 크기가되도록 만들기시 내 ImageViews의 크기를 설정할 수 있기를 원합니다.

공용 클래스 게임 활동 OnClickListener를 {

개인 BoardView boardView를 구현 확장;

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    boardView = new BoardView(this); 

    setContentView(boardView); // when this line disabled, it looks ok 
    boardView.requestFocus(); 

} 

공개 클래스 BoardView 확장보기 { private final Game game; 전용 플로트 너비; // 한 단위의 너비 전용 플로트 높이; // 한 단위의 높이

public BoardView (컨텍스트 컨텍스트) { super (컨텍스트); this.game = (게임) 컨텍스트; setFocusable (true); setFocusableInTouchMode (true);

LinearLayout maincontainer = new LinearLayout(game); 
    maincontainer.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)); 
    maincontainer.setGravity(Gravity.CENTER); 
    maincontainer.setOrientation(LinearLayout.VERTICAL); 
    maincontainer.setBackgroundColor(Color.BLACK); 

    LinearLayout innercontainer = new LinearLayout(game); 
    innercontainer.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT)); 
    innercontainer.setGravity(Gravity.CENTER); 
    innercontainer.setOrientation(LinearLayout.HORIZONTAL); 

    // declare a new table 
    TableLayout layout = new TableLayout(game); 
    layout.setLayoutParams(new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT)); 

    // build a grid of ImageViews in a TableLayout 
    for (int f=1; f<=7; f++) { 
     TableRow tr = new TableRow(game); 
     for (int c=1; c<=7; c++) { 
     ImageView b = new ImageView(game); 
     b.setImageResource(R.drawable.neworb); 
     b.setOnClickListener(game);    
      tr.addView(b, 30,30); // I'd like to not use fixed values here 
     } // for 
     layout.addView(tr); 
    } // for 
    innercontainer.addView(layout); 
    maincontainer.addView(innercontainer); 

    game.setContentView(maincontainer); 

}가

@Override 보호 보이드가 onSizeChanged (INT INT H, INT oldw, INT oldh, w) = { 폭/9F w; 높이 = 너비;

super.onSizeChanged (w, h, oldw, oldh); }

은}

답변

2

생각 나는 내 자신의 문제를 해결했다. Overriden onDraw 메서드를 사용하여 내 뷰 구축 코드를 배치하는 것을 게을리했습니다. 즉 :

@Override 
protected void onDraw(Canvas canvas) 
{ 

    LinearLayout maincontainer = new LinearLayout(this.game); 

    // etc.. 

난 그냥 메인 클래스 내에 포함하고 onDraw는 ... 당신이보기를 확장 할 때 해있는 재정의되지 않았습니다.

+1

***************** 사실, 그렇게 좋은 해결책은 아닙니다. 예, 효과가있었습니다. 하지만 .... 이제 새로운 객체를 만들고 각 스크린을 그려서 던져 버립니다. 아주 나쁜 형태. LogCat은 내가 가비지 컬렉터를 초과 근무 중이라고 알려줍니다. – DeadTime

+0

나는 실제로 다른 것을 찾기 위해 이곳을 우연히 발견했지만 독자가 자신의 솔루션을 게시하고 미래의 독자들에게 그 단점에 대해 경고 할 시간을 가졌다는 것을 알 수 없었습니다. 나는 그것으로부터, 슬프게도 이익을 얻지 않을 것이다. 그러나 나는 많은 사람들이 확신 할 것이다. 고맙습니다! – slezica

관련 문제