2012-06-18 4 views
0

Я немного застрял. Сначала я опубликую скриншот, а затем задаю свой вопрос.Как получить графический ресурс изображений, добавленных динамически на Android?

Output


Вы можете видеть, что некоторые овалов проверяются. То, что я сделал, это поддерживать 2 набора изображений, и когда пользователь нажимает, белое изображение становится черным.
Теперь мне нужно собрать ответы на этом листе ответов и узнать, как это сделать. Я попробовал метод под названием getImageResource(), но этого не существует. Пожалуйста, помогите мне, как это сделать.

Код:

public class QuizActivity extends Activity implements OnClickListener { 
/** Called when the activity is first created. */ 
RelativeLayout r2; 
// Global variable(s) 
int[][] quizData; // Storing the quiz specifications in an integer array 
int[][] questionImages = { 
     { R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d, 
       R.drawable.e, R.drawable.f, R.drawable.g, R.drawable.h, 
       R.drawable.i, R.drawable.j }, 
     { R.drawable.a_checked, R.drawable.b_checked, R.drawable.c_checked, 
       R.drawable.d_checked, R.drawable.e_checked, 
       R.drawable.f_checked, R.drawable.g_checked, 
       R.drawable.h_checked, R.drawable.i_checked, 
       R.drawable.j_checked }, 
     { R.drawable.zero, R.drawable.one, R.drawable.two, 
       R.drawable.three, R.drawable.four, R.drawable.five, 
       R.drawable.six, R.drawable.seven, R.drawable.eight, 
       R.drawable.nine, R.drawable.decimal }, 
     { R.drawable.zero_checked, R.drawable.one_checked, 
       R.drawable.two_checked, R.drawable.three_checked, 
       R.drawable.four_checked, R.drawable.five_checked, 
       R.drawable.six_checked, R.drawable.seven_checked, 
       R.drawable.eight_checked, R.drawable.nine_checked, 
       R.drawable.decimal_checked } }; 

// End 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    // Beginning of variable declarations 
    ScrollView s1 = new ScrollView(this); 
    RelativeLayout r1 = new RelativeLayout(this); 
    r2 = r1; 
    File quizSpecs = new File("mnt/sdcard/teacher_1.csv"); // Read the file 
    BufferedReader csvReader = null; 
    String line = ""; // Storing each line in a string 
    StringTokenizer currentLine = null; 
    int noOfQuestions = 0; // Number of questions in the quiz 
    int time = 0; // Duration of the quiz 
    int i = 0, j = 0, k = 0; // Loop variables 
    int previd = 0; 
    // End of variable declarations 

    try { 
     csvReader = new BufferedReader(new FileReader(quizSpecs)); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    try { 
     line = csvReader.readLine(); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    currentLine = new StringTokenizer(line, ","); 
    noOfQuestions = Integer.parseInt(currentLine.nextToken()); 
    time = Integer.parseInt(currentLine.nextToken()); 
    // System.out.println(noOfQuestions + " " + time); 
    while (currentLine.hasMoreTokens()) { 
     currentLine.nextToken(); 
    } 
    quizData = new int[noOfQuestions][6]; 
    for (i = 0; i < noOfQuestions; i++) { 
     try { 
      line = csvReader.readLine(); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     currentLine = new StringTokenizer(line, ","); 
     for (j = 0; j < 6; j++) { 
      quizData[i][j] = Integer.parseInt(currentLine.nextToken()); 
      // System.out.println(quizData[i][j]); 
     } 
    } 
    try { 
     csvReader.close(); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    for (i = 0; i < noOfQuestions; i++) { 
     TextView questionNo = new TextView(this); 
     questionNo.setText(String.valueOf(i + 1)); 
     questionNo.setId(1000 * (i + 1)); 
     questionNo.setTextSize(18); 
     RelativeLayout.LayoutParams p1 = new RelativeLayout.LayoutParams(
       RelativeLayout.LayoutParams.WRAP_CONTENT, 
       RelativeLayout.LayoutParams.WRAP_CONTENT); 
     p1.addRule(RelativeLayout.BELOW, previd); 
     previd = (1000 * (i + 1)); 
     questionNo.setLayoutParams(p1); 
     r1.addView(questionNo, p1); 
     switch (quizData[i][1]) { 
     case 1: 
     case 2: 
      for (j = 0; j < quizData[i][2]; j++) { 
       ImageView option = new ImageView(this); 
       option.setImageResource(questionImages[0][j]); 
       option.setId((1000 * (i + 1)) + j + 1); 
       option.setOnClickListener(this); 
       /* 
       * if (j >= quizData[i][2]) { 
       * option.setVisibility(View.INVISIBLE); 
       * option.setEnabled(false); } 
       */ 
       RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
         RelativeLayout.LayoutParams.WRAP_CONTENT, 
         RelativeLayout.LayoutParams.WRAP_CONTENT); 
       params.addRule(RelativeLayout.BELOW, ((1000 * i) + 1)); 
       params.addRule(RelativeLayout.RIGHT_OF, 
         ((1000 * (i + 1)) + j)); 
       previd = ((1000 * (i + 1)) + j); 
       option.setLayoutParams(params); 
       r1.addView(option, params); 
      } 
      break; 
     case 3: 
      for (j = 0; j < (quizData[i][3] == 0 ? quizData[i][2] 
        + quizData[i][3] : quizData[i][2] + quizData[i][3] + 1); j++) { 
       for (k = 10; k > -1; k--) { 
        ImageView num = new ImageView(this); 
        num.setImageResource(questionImages[2][10 - k]); 
        num.setId((1000 * (i + 1)) + (100 * j) + k + 1); 
        num.setOnClickListener(this); 
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
          RelativeLayout.LayoutParams.WRAP_CONTENT, 
          RelativeLayout.LayoutParams.WRAP_CONTENT); 
        if (j == 0) { 
         params.addRule(RelativeLayout.RIGHT_OF, 
           (1000 * (i + 1))); 
        } else { 
         params.addRule(RelativeLayout.RIGHT_OF, 
           (1000 * (i + 1)) + (100 * (j - 1)) + k + 1); 
        } 
        if (k == 10) { 
         params.addRule(RelativeLayout.BELOW, (1000 * i) + 1); 
        } else { 
         params.addRule(RelativeLayout.BELOW, 
           ((1000 * (i + 1)) + (100 * j) + k + 2)); 
        } 
        num.setLayoutParams(params); 
        r1.addView(num, params); 
       } 
      } 
      previd = (1000 * (i + 1)) + 1; 
      break; 
     case 4: 
     case 5: 
      for (j = quizData[i][2] - 1; j > -1; j--) { 
       for (k = 0; k < quizData[i][3]; k++) { 
        ImageView match = new ImageView(this); 
        match.setImageResource(questionImages[0][k]); 
        match.setId((1000 * (i + 1)) + (100 * j) + k + 1); 
        match.setOnClickListener(this); 
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
          RelativeLayout.LayoutParams.WRAP_CONTENT, 
          RelativeLayout.LayoutParams.WRAP_CONTENT); 
        if (k == 0) { 
         params.addRule(RelativeLayout.RIGHT_OF, 
           (1000 * (i + 1))); 
        } else { 
         params.addRule(RelativeLayout.RIGHT_OF, 
           (1000 * (i + 1)) + (100 * j) + k); 
        } 
        if (j == quizData[i][2] - 1) { 
         params.addRule(RelativeLayout.BELOW, (1000 * i) + 1); 
        } else { 
         params.addRule(RelativeLayout.BELOW, 
           (1000 * (i + 1)) + (100 * (j + 1)) + k + 1); 
        } 
        match.setLayoutParams(params); 
        r1.addView(match, params); 
       } 
      } 
      previd = (1000 * (i + 1)) + 1; 
      break; 
     } 
    } 
    s1.addView(r1, new LayoutParams(LayoutParams.FILL_PARENT, 
      LayoutParams.FILL_PARENT)); 
    this.setContentView(s1); 
} 

public void onClick(View v) { 
    // TODO Auto-generated method stub 
    // Beginning of variable declarations 
    int clickedButton = v.getId(); 
    int questionNo = clickedButton/1000; // Finding the question number 
    int i = 0; // Loop variable 
    int rowNo = (clickedButton/100) % 10; 
    // System.out.println(questionNo); 
    // System.out.println(quizData[questionNo - 1][1]); 
    switch (quizData[questionNo - 1][1]) { 
    case 1: 
     for (i = 0; i < quizData[questionNo - 1][2]; i++) { 
      ImageView option = new ImageView(this); 
      option.setImageResource(questionImages[0][i]); 
      option.setId((1000 * questionNo) + i + 1); 
      option.setOnClickListener(this); 
      /* 
      * if (i >= quizData[questionNo - 1][2]) { 
      * option.setVisibility(View.INVISIBLE); 
      * option.setEnabled(false); } 
      */ 
      RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
        RelativeLayout.LayoutParams.WRAP_CONTENT, 
        RelativeLayout.LayoutParams.WRAP_CONTENT); 
      params.addRule(RelativeLayout.BELOW, 
        ((1000 * (questionNo - 1)) + 1)); 
      params.addRule(RelativeLayout.RIGHT_OF, 
        ((1000 * questionNo) + i)); 
      option.setLayoutParams(params); 
      r2.addView(option, params); 
     } 
     ImageView option = new ImageView(this); 
     option.setImageResource(questionImages[1][(clickedButton % 10) - 1]); 
     option.setId((1000 * questionNo) + (clickedButton % 10)); 
     option.setOnClickListener(this); 
     RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
       RelativeLayout.LayoutParams.WRAP_CONTENT, 
       RelativeLayout.LayoutParams.WRAP_CONTENT); 
     params.addRule(RelativeLayout.BELOW, 
       ((1000 * (questionNo - 1)) + 1)); 
     params.addRule(RelativeLayout.RIGHT_OF, ((1000 * questionNo) 
       + (clickedButton % 10) - 1)); 
     option.setLayoutParams(params); 
     r2.addView(option, params); 
     break; 
    case 2: 
     ImageView checked = new ImageView(this); 
     checked.setImageResource(questionImages[1][(clickedButton % 10) - 1]); 
     checked.setId((1000 * questionNo) + (clickedButton % 10)); 
     checked.setOnClickListener(this); 
     RelativeLayout.LayoutParams params_checked = new RelativeLayout.LayoutParams(
       RelativeLayout.LayoutParams.WRAP_CONTENT, 
       RelativeLayout.LayoutParams.WRAP_CONTENT); 
     params_checked.addRule(RelativeLayout.BELOW, 
       ((1000 * (questionNo - 1)) + 1)); 
     params_checked.addRule(RelativeLayout.RIGHT_OF, 
       ((1000 * questionNo) + (clickedButton % 10) - 1)); 
     checked.setLayoutParams(params_checked); 
     r2.addView(checked, params_checked); 
     break; 
    case 3: 
     for (i = 10; i > -1; i--) { 
      ImageView num = new ImageView(this); 
      num.setImageResource(questionImages[2][10 - i]); 
      num.setId((1000 * questionNo) + (100 * rowNo) + i + 1); 
      num.setOnClickListener(this); 
      RelativeLayout.LayoutParams params_num = new RelativeLayout.LayoutParams(
        RelativeLayout.LayoutParams.WRAP_CONTENT, 
        RelativeLayout.LayoutParams.WRAP_CONTENT); 
      if (rowNo == 0) { 
       params_num.addRule(RelativeLayout.RIGHT_OF, 
         (1000 * questionNo)); 
      } else { 
       params_num.addRule(RelativeLayout.RIGHT_OF, 
         (1000 * questionNo) + (100 * (rowNo - 1)) + i + 1); 
      } 
      if (i == 10) { 
       params_num.addRule(RelativeLayout.BELOW, 
         (1000 * (questionNo - 1)) + 1); 
      } else { 
       params_num.addRule(RelativeLayout.BELOW, 
         ((1000 * questionNo) + (100 * rowNo) + i + 2)); 
      } 
      num.setLayoutParams(params_num); 
      r2.addView(num, params_num); 
     } 
     ImageView num = new ImageView(this); 
     num.setImageResource(questionImages[3][11 - (clickedButton % 100)]); 
     num.setId((1000 * questionNo) + (100 * rowNo) 
       + (clickedButton % 100)); 
     num.setOnClickListener(this); 
     RelativeLayout.LayoutParams params_num = new RelativeLayout.LayoutParams(
       RelativeLayout.LayoutParams.WRAP_CONTENT, 
       RelativeLayout.LayoutParams.WRAP_CONTENT); 
     if (rowNo == 0) { 
      params_num 
        .addRule(RelativeLayout.RIGHT_OF, (1000 * questionNo)); 
     } else { 
      params_num.addRule(RelativeLayout.RIGHT_OF, (1000 * questionNo) 
        + (100 * (rowNo - 1)) + (clickedButton % 100)); 
     } 
     if (((clickedButton % 100) - 1) == 10) { 
      params_num.addRule(RelativeLayout.BELOW, 
        (1000 * (questionNo - 1)) + 1); 
     } else { 
      params_num.addRule(RelativeLayout.BELOW, ((1000 * questionNo) 
        + (100 * rowNo) + (clickedButton % 100) + 1)); 
     } 
     num.setLayoutParams(params_num); 
     r2.addView(num, params_num); 
     break; 
    case 4: 
     for (i = 0; i < quizData[questionNo - 1][3]; i++) { 
      ImageView match = new ImageView(this); 
      match.setImageResource(questionImages[0][i]); 
      match.setId((1000 * questionNo) + (100 * rowNo) + i + 1); 
      match.setOnClickListener(this); 
      RelativeLayout.LayoutParams params_match = new RelativeLayout.LayoutParams(
        RelativeLayout.LayoutParams.WRAP_CONTENT, 
        RelativeLayout.LayoutParams.WRAP_CONTENT); 
      if (i == 0) { 
       params_match.addRule(RelativeLayout.RIGHT_OF, 
         (1000 * questionNo)); 
      } else { 
       params_match.addRule(RelativeLayout.RIGHT_OF, 
         (1000 * questionNo) + (100 * rowNo) + i); 
      } 
      if (rowNo == quizData[questionNo - 1][2] - 1) { 
       params_match.addRule(RelativeLayout.BELOW, 
         (1000 * (questionNo - 1)) + 1); 
      } else { 
       params_match.addRule(RelativeLayout.BELOW, 
         (1000 * questionNo) + (100 * (rowNo + 1)) + i + 1); 
      } 
      match.setLayoutParams(params_match); 
      r2.addView(match, params_match); 
     } 
     ImageView match = new ImageView(this); 
     match.setImageResource(questionImages[1][(clickedButton % 10) - 1]); 
     match.setId((1000 * questionNo) + (100 * rowNo) 
       + (clickedButton % 10)); 
     match.setOnClickListener(this); 
     RelativeLayout.LayoutParams params_match = new RelativeLayout.LayoutParams(
       RelativeLayout.LayoutParams.WRAP_CONTENT, 
       RelativeLayout.LayoutParams.WRAP_CONTENT); 
     if (((clickedButton % 10) - 1) == 0) { 
      params_match.addRule(RelativeLayout.RIGHT_OF, 
        (1000 * questionNo)); 
     } else { 
      params_match.addRule(RelativeLayout.RIGHT_OF, 
        (1000 * questionNo) + (100 * rowNo) 
          + (clickedButton % 10) - 1); 
     } 
     if (rowNo == quizData[questionNo - 1][2] - 1) { 
      params_match.addRule(RelativeLayout.BELOW, 
        (1000 * (questionNo - 1)) + 1); 
     } else { 
      params_match.addRule(RelativeLayout.BELOW, 
        (1000 * (questionNo)) + (100 * (rowNo + 1)) 
          + (clickedButton % 10)); 
     } 
     match.setLayoutParams(params_match); 
     r2.addView(match, params_match); 
     break; 
    case 5: 
     ImageView match_checked = new ImageView(this); 
     match_checked 
       .setImageResource(questionImages[1][(clickedButton % 10) - 1]); 
     match_checked.setId((1000 * questionNo) + (100 * rowNo) 
       + (clickedButton % 10)); 
     match_checked.setOnClickListener(this); 
     RelativeLayout.LayoutParams params_mc = new RelativeLayout.LayoutParams(
       RelativeLayout.LayoutParams.WRAP_CONTENT, 
       RelativeLayout.LayoutParams.WRAP_CONTENT); 
     if (((clickedButton % 10) - 1) == 0) { 
      params_mc.addRule(RelativeLayout.RIGHT_OF, 1000 * questionNo); 
     } else { 
      params_mc.addRule(RelativeLayout.RIGHT_OF, (1000 * questionNo) 
        + (100 * rowNo) + (clickedButton % 10) - 1); 
     } 
     if (rowNo == quizData[questionNo - 1][2] - 1) { 
      params_mc.addRule(RelativeLayout.BELOW, 
        (1000 * (questionNo - 1)) + 1); 
     } else { 
      params_mc.addRule(RelativeLayout.BELOW, (1000 * (questionNo)) 
        + (100 * (rowNo + 1)) + (clickedButton % 10)); 
     } 
     match_checked.setLayoutParams(params_mc); 
     r2.addView(match_checked, params_mc); 
     System.out.println(match_checked.getDrawable()); 
     break; 
    } 
} 
} 
+0

@GAMA, спасибо за редактирование. Вы можете мне помочь? – pratnala

+1

извините, приятель. Я могу предложить обрезать код ur или добавлять комментарии, чтобы сделать его более читаемым и понятным. – GAMA

+0

Мне нужна помощь! :( – pratnala

ответ

1

Вместо того, чтобы отслеживать изображение, которое в настоящее время используется, вместо него вы должны думать о проблеме с точки зрения модели данных. Модель данных содержит состояние приложения. Мне кажется, что у вас есть набор вопросов, каждый вопрос имеет разные возможные ответы, а затем есть выбранный ответ/ответы. Если вы моделируете данные, вы можете применить любой вид логики просмотра, который вы хотите для состояния модели. Это прямо из парадигмы MVC (Model View Controller).

Я сомневаюсь, что ваше приложение, поскольку оно теперь будет масштабироваться вообще, и поэтому вы должны определить какую-то модель, которую легко можно было бы просто сделать с помощью нескольких классов (класс вопросов, класс ответа), и вы можете определить отношения a несколько разных способов. Оттуда вы просто выберете представление, основанное на текущем состоянии модели. В android это делается с Adapters и AdapterView. Как правило, вы не будете использовать их напрямую, и в вашем случае вы, вероятно, используете ListView с ListAdapter. Что вы будете делать, когда пользователь нажимает на то, что вы захватите это событие, а затем обновите модель. Ваш ListAdapter будет прослушивать изменения в модели с помощью DataSetObserver, однако вы можете просто прослушивать клики и делать изменения непосредственно в прослушивателях onclick вместо того, чтобы идти на полное расстояние от наблюдателя.

Это, очевидно, не то, что вы могли бы сделать через час или два, если бы вы не были знакомы со всеми этими вещами, но IMO сделало бы ваше приложение более чистым, легким для отладки и более простым в тестировании и более надежным.

+0

Я не мог получить потребность в классах здесь. Потому что все данные для каждого вопроса извлекаются из внешнего источника, то есть файла CSV. И это всего лишь лист ответов, который я показываю. Это на самом деле один модуль, который я делаю. – pratnala

+0

вопросы/ответы всегда одинаковые? Там действительно должен быть простой способ разместить эти данные из CSV в модель и просто обновить модель. Просто потому, что я говорю, что модель не означает, что данные живут в приложении, это может происходить из внешнего источника. . В этом весь смысл модели данных состоит в том, что она может происходить из любого места, а ваши другие уровни кода остаются неизменными. Будь то CSV-файл, база данных, XML, ответ JSON и т. Д. Вы просто изменяете код, который извлекает данные, и все остальное остается неизменным. –

+0

Моему наставнику не нужны флажки и переключатели. Это проблема. Мы должны использовать такие изображения. И все изображения вставляются динамически. – pratnala

0

ниже селектор для CheckBox с именем «bt.xml» и поместить этот файл в папку вытяжки

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item android:state_checked="true" android:drawable="@drawable/chceked_image"/> 
    <item android:drawable="@drawable/unchceked_image"/> 

</selector> 

и использовать CheckBox вместо ImageView как с именем «row.xml» в папке макета

<CheckBox 
     android:layout_height="30dp" 
     android:layout_width="30dp" 
     android:button="@drawable/bt" 
     android:focusable="false" 
     android:id="@+id/ch"/> 

атрибуты кнопки изменения изображения Checkbox с вашими собственными изображениями

Если вы будете использовать ChcekBox, которые два состояния проверены и не-Checked то легко получить состояние ответа.

Теперь использовать макет Inflater раздувать XML, например, у вас есть три ответа на любой вопрос, то

ChcekBox ch[] = new CheckBox[3]; 

layout = findViewById(R.id.main_layout); 
LayoutInflater layoutInflater = LayoutInflater.from(this); 

for(int i = 0; i<3; i++) 
{ 
    View rowView = layoutInflater.inflate(R.layout.row, layout); 
    ch[i] = (CheckBox)rowView.findViewById(R.id.ch); 
    ch[i].setId(assign_new_id); 
} 
+0

Как это сделать динамически? – pratnala

+0

см. Отредактированный ответ –

Смежные вопросы