2014-11-13 2 views
0

다른 ID (Java 파일의 로컬 변수 - 코드 참조)가있는 두 행의 TextView가있는 동적 테이블 행을 만들었습니다. TextView의 ID와 동일한 ID를 사용하여 다른 액티비티를 열고 싶습니다. (의도를 사용하여 보낼 수 있습니다)테이블 레이아웃의 TextViews onClickListener에 동적 데이터 추가

하지만 먼저 TextView에 할당 된 동일한 ID로 토스트를 인쇄하려고했습니다. XML 코드

// Java Code 

    int id = 3; 
    for (int i = 1; i <= 3; i++) { 

     TableRow row = new TableRow(TableActivity.this); 
     // add Layouts to your new row 
     TextView txt1 = new TextView(TableActivity.this); 
     txt1.setText("" + id); 
     txt1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       Toast.makeText(getApplicationContext(), "" + id, 
         Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     id++; 

     TextView txt2 = new TextView(TableActivity.this); 
     txt2.setText("" + id); 
     id++; 

     row.addView(txt1); 
     row.addView(txt2); 

     // add your new row to the TableLayout: 
     TableLayout table = (TableLayout) findViewById(R.id.tableLayout1); 
     table.addView(row); 
} 

,

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/tableLayout1" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:layout_marginTop="10dp" 
android:stretchColumns="0,1,2,3" 
tools:context="com.himanshu.fileimage.TableActivity" > 

<TableRow 
    android:id="@+id/tableRow1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" > 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:text="Column1" 
     android:textColor="#000000" /> 

    <TextView 
     android:id="@+id/textView2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:text="Column2" 
     android:textColor="#000000" /> 
</TableRow> 
오류가 내부 클래스 내부로 ID가 최종 변수되어야한다는 토스트 붙어

.

내 문제의 가능한 해결책은 무엇입니까?

+0

u가없는 목록보기 –

+0

@NaveenTamrakar Why ListView? –

+0

런타임에 데이터를 추가하려는 경우 런타임에 listview에 데이터를 추가했습니다. –

답변

3

인라인을 정의한 다른 클래스 (View.OnClickListener)에 속한 메소드의 내부에서 외부 클래스의 메소드에 로컬 변수를 액세스하려고하기 때문입니다. 그 부분은 위의 코드 클래스에 대한 멤버로서 메소드 외부에서 id 변수를 선언함으로써 해결할 수 있습니다.

그러나 TextView를 클릭 할 때 "id"값을 인쇄하려고하지만 id 값이 onClickListener를 설정 한 직후에 (변경하여) 변경 한 경우 문제가 해결되지 않습니다. 다른보기를 렌더링하는 시간. 그래서 토스트를 얻을 것이지만 잘못된 id 값을 갖습니다.

올바른 것을 얻기 위해 TextView를 터치하여 원하는 ID를 알고 텍스트 뷰에 태그로 ID를 설정하려는 경우 - txt1.setTag (id); 변경하기 전에/다음 TextView에 대해 ID 값을 설정합니다.

이제는 makeToast 메소드의 View.OnClickListener에 대한 onClick에서 id 대신 두 번째 매개 변수로 v.getTag()를 전달하면 원하는 결과가 출력됩니다.

EDIT : BTW, 뷰에 태그로 ID를 설정하면 클래스 변수 일 필요는 없지만 위의 코드에서와 같이 메소드에 로컬 일 수 있습니다. 내 첫 번째 단락은 왜 당신이 onClick 내부에서 그것에 액세스 할 수 없었는지 설명하기 위해서였습니다

+0

내 문제에 대한 자세한 설명과 함께 훌륭한 대답입니다. 대단히 감사합니다 @mistwalker –

관련 문제