2016-08-06 7 views
2

그래서 Android 앱에서 프로그래밍 방식으로 Dialog 클릭 트리거가되는 단추를 추가하려고합니다. 유효하지 않은 인덱스 7, 크기 -프로그래밍 방식으로 단추 텍스트를 자동으로 설정합니다. 인덱스

중 하나를 마지막 Button에서 텍스트를 얻는 것은 오류가 tv1.setText (...)를 호출 IOOBException이 있음을 주장, 추가 나는 OnClickListener이 버튼을 추가 할 때, 내가있어 7 일뿐입니다. 아무도 각 Button을 어떻게 설정하여 각 버튼에 고유 한 정보가있는 Dialog을 새로 만들 수 있는지 알 수 있습니까? 코드에 많은 문제가 있습니다

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_all_streaks); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    prefs = getSharedPreferences("carter.streakly", Context.MODE_PRIVATE); 
    editor = prefs.edit(); 

    db = new DatabaseHelper(this); 
    mTableLayout = (TableLayout) findViewById(R.id.all_streak_table); 
    res = db.getAllData(); 
    if(res.getCount() ==0) { 
     //show message 
     showMessage("Error", "Nothing found"); 
     return; 
    } 

    streakArrayList = new ArrayList<>(); 

    int counter = 0; 
    while (res.moveToNext()){ 
     streakArrayList.add(new Streak(Integer.parseInt(res.getString(0)), res.getString(1), res.getString(2), res.getString(3), Integer.parseInt(res.getString(4)))); 
     counter++; 
    } 

    LinearLayout.LayoutParams btnParams = new LinearLayout.LayoutParams(200, 200); 
    btnParams.setMargins(200, 30, 80, 30); 

    LinearLayout.LayoutParams tvParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ActionBar.LayoutParams.WRAP_CONTENT); 
    tvParams.setMargins(100, 0, 0, 0); 

    i = 0; 
    while (i < counter){ 
     if(i%2==0){ 
      mTableRow = new TableRow(this); 
      mTableLayout.addView(mTableRow); 
     } 

     ll = new LinearLayout(this); 
     ll.setOrientation(LinearLayout.VERTICAL); 
     mTableRow.addView(ll); 

     Button btn = new Button(this); 
     btn.setText(""+streakArrayList.get(i).getDaysKept()); 
     btn.setId(i); 
     btn.setBackground(getResources().getDrawable(R.drawable.round_button)); 
     btn.setLayoutParams(btnParams); 
     btn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Dialog dialog = new Dialog(AllStreaks.this); 
       dialog.setContentView(R.layout.activity_enlarged); 

       tv1 = (TextView) dialog.findViewById(R.id.activity_enlarge_icon); 
       tv1.setText(streakArrayList.get(i-1).getActivityName()); 
       dialog.show(); 
       /* 
       Intent intent = new Intent(AllStreaks.this, EnlargedActivity.class); 
       intent.putExtra("passName", streakArrayList.get(view.getId()).getActivityName()); 
       startActivity(intent);*/ 
      } 
     }); 

     ll.addView(btn); 

     TextView tv = new TextView(this); 
     tv.setText(streakArrayList.get(i).getActivityName()); 
     tv.setId(i); 
     tv.setGravity(Gravity.CENTER | Gravity.BOTTOM); 
     tv.setTextSize(20); 
     tv.setLayoutParams(tvParams); 
     ll.addView(tv); 

     i++; 
    } 
} 

public void showMessage(String title, String message){ 
    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setCancelable(true); 
    builder.setTitle(title); 
    builder.setMessage(message); 
    builder.show(); 
} 
+0

당신이 전화해도'res.moveToFirst()'당신의 카운터를 계산하기 전에? – Shaishav

+0

당신은 전혀 정교 할 수 있습니까? 어디에서 res.moveToFirst()를 호출해야하며 그 이유는 무엇입니까? 고맙습니다!! –

+0

while 루프 앞에 counter = 0을 지정하면 moveToFirst를 추가하십시오. – Shaishav

답변

0

: 문제가 포즈 것 코드의

발췌문.

먼저 TableRowLinearLayout의 글로벌 인스턴스를 사용하고 있습니다. 즉, 루프의 모든 반복에서이를 덮어 쓰므로 결국 마지막 반복의 값만 표시됩니다.

ButtonTextView에 동일한 ID를 지정하면 고유해야합니다.

변수 counter을 사용하면 for 루프를 사용하여 streakArrayList을 반복 할 수 있습니다. 이 같은

뭔가 :

for (Streak streak : streakArrayList) { 
    TableRow mTableRow = new TableRow(this); 
    LinearLayout ll = new LinearLayout(this); 
    ll.setOrientation(LinearLayout.VERTICAL); 

    final String activityName = streak.getActivityName(); 

    Button btn = new Button(this); 
    btn.setText("" + streak.getDaysKept()); 
    btn.setId(aUniqueId); 
    btn.setBackground(getResources().getDrawable(R.drawable.round_button)); 
    btn.setLayoutParams(btnParams); 
    btn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Dialog dialog = new Dialog(AllStreaks.this); 
      dialog.setContentView(R.layout.activity_enlarged); 

      tv1 = (TextView) dialog.findViewById(R.id.activity_enlarge_icon); 
      tv1.setText(activityName); 
      dialog.show(); 
     } 
    }); 

    TextView tv = new TextView(this); 
    tv.setText(activityName); 
    tv.setId(anotherUniqueId); 
    tv.setGravity(Gravity.CENTER | Gravity.BOTTOM); 
    tv.setTextSize(20); 
    tv.setLayoutParams(tvParams); 

    ll.addView(btn); 
    ll.addView(tv); 

    mTableRow.addView(ll); 
    mTableLayout.addView(mTableRow); 
}