2011-10-24 2 views
0

저는 아직 안드로이드 프로그래밍에있어 새로운 것을 시도하고 있습니다. 5x5 차원의 TableLayout을 만들고 싶습니다. 나는 GridView BaseAdapter를 사용하여 Inflate 서비스를 사용하여이 작업을 수행 할 수 있음을 알고 있습니다. 하지만이 중 하나는 테이블 레이아웃을 사용하여 적용하려고합니다. 아래는 코드입니다. TableLayout의 새 인스턴스와 Table 행의 새 인스턴스를 만듭니다. 각 테이블 행에서 5 TextView 인스턴스를 만들었습니다. 하지만 일단 에뮬레이터 나 휴대 전화에서 열면 TableRow가 생성되지 않고 비어있는 빈 테이블 레이아웃 만 만들어집니다. 또한 예외가 발생하지 않았습니다.5x5 크기의 안드로이드 테이블 레이아웃

GridView navIcon = (GridView) findViewById (R.id.content); navIcon.setAdapter (새 ImageAdapter (this));

navIcon.setOnItemClickListener(new OnItemClickListener(){ 

     @Override 
     public void onItemClick(AdapterView<?> parent, View v, int position,long id) { 
      // TODO Auto-generated method stub    

      if (position==0){ 

       try{ 
        TableLayout calgrid = (TableLayout) findViewById(R.id.gridtable);      
        Context ctxt = v.getContext(); 
        TextView[] tView = new TextView[25];  
        calgrid = new TableLayout(ctxt); 
        int dip = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,(float) 1, getResources().getDisplayMetrics()); 
        int counter=1; 
        TableRow[] tr = new TableRow[5]; 
        for(int j=0;j<5;j++){ 
         tr[j] = new TableRow(ctxt); 
         for(int i=0;i<5;i++){        
          tView[i] = new TextView(ctxt); 

          tView[i].setText(String.valueOf(counter));  
          tView[i].setTextSize(15); 
          counter+=1; 
          tView[i].setWidth(50 * dip); 
          tView[i].setPadding(20*dip, 0, 0, 0); 
          tView[i].setTextColor(Color.rgb(100, 200, 200));        
          Toast.makeText(getApplicationContext(), "tView["+i+"] value " + String.valueOf(tView[i].getText()), Toast.LENGTH_SHORT).show();      

          tr[j].addView(tView[i], 50, 50);        
         } 
         calgrid.addView(tr[j]);       
        }           
       }catch(Exception e){ 
        Log.e("MainActivity", "Error in activity", e); 
        Toast.makeText(getApplicationContext(),e.getClass().getName() + " " + e.getMessage(),Toast.LENGTH_LONG).show(); 
       }           
      } 
     } 

    }); 

답변

1

우선, 기본적으로 완전히 다른 무언가에이 변수를 할당 지금이 리뷰를 찾을 말한다 calgrid = (TableLayout) findViewById(R.id.gridtable); 다음 calgrid = new TableLayout(ctxt);을 할 수있는 실수입니다. 두 번째 명령문을 제거하면 xml에서 원하는 테이블이로드됩니다.

둘째로, 나는 여기에서 많은 일이 일어나기 때문에 자신을 위해 단순화하는 것이 좋은 생각이라고 생각합니다. onClick 청취자 내부에서이 모든 작업을 수행하는 대신 onCreate 메소드 자체에서 수행하십시오. 또한 GridView에서 컨텍스트를 사용하는 것 같아 이상하게 보입니다. 아마도 xml 레이아웃 파일을 게시 한 경우 귀하가 무엇을하려고하는지 설명하는 데 도움이 될 수 있습니까?

tView[i]은 최대 5 개의 항목 만 할당하지만 배열에는 25 개의 항목이 포함되므로 TextViews 배열의 색인에 문제가 있습니다. 대신 tView[(j*5)+i]을 사용해보십시오. 나는 이것이 당신의 문제를 일으키는 것은 아니라고 생각하지만 당신이 당신의 아이템을 올바르게 할당하고 있는지 확인하십시오. 여기

당신은 당신이 넣어 시도 할 수 있습니다 활동 그 자체에서 작업을 진행 한 후에는

setContentView(R.layout.grid); 

    TableLayout tl = (TableLayout) findViewById(R.id.gridtable); 
    for (int j = 0; j < 5; j++) { 
     TableRow tr = new TableRow(this); 
     tr.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
       LayoutParams.WRAP_CONTENT)); 
     for (int i = 0; i < 5; i++) { 
      TextView tView = new TextView(this); 

      tView.setText("TEXT" + String.valueOf((j * 5) + i + 1)); 
      tView.setLayoutParams(new LayoutParams(
        LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); 

      tr.addView(tView); 
     } 
     tl.addView(tr, new TableLayout.LayoutParams(
       LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); 
    } 

grid.xml

<?xml version="1.0" encoding="utf-8"?> 
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/gridtable" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 
</TableLayout> 

을 원하는 라인을 따라 뭔가를 수행하는 방법의 예입니다 GridView에 연결된 리스너 내부에 있습니다. 희망이 도움이!

+0

감사합니다. 기존 코드를 그대로 유지합니다. calgrid = 새로운 TableLayout (ctxt)을 제거한 후에 작동합니다. 내 코드에서이 한 줄의 코드가 작동하지 않기 때문입니다. 다음에는 객체를 인스턴스화 할 때주의해야합니다. 나는 어제 내 하루 종일 잘못한 것을 알아 내려고합니다. 당신의 충고는 정말 도움이됩니다. – Zahary

+0

도움이 되니 기쁩니다. 귀하의 질문에 답변이 있으면이 대답을 수락하십시오. – Craigy