2012-01-20 2 views

ответ

95

Вы создаете файл ids.xml и поместить все необходимые идентификаторы в нем, как показано ниже

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
     <item type="id" name="layout1" /> 
     <item type="id" name="layout2" /> 
     <item type="id" name="layout3" /> 
</resources> 

Теперь для динамически создаваемых макетов или представлений Вы можете использовать эти идентификаторы, как показано ниже

new_layout1.setId(R.id.layout1); 
new_view2.setId(R.id.layout2); 
new_layout3.setId(R.id.layout3); 

Я надеюсь, что это может помочь вам.

+0

Неплохо, это работает. Но тем не менее, никогда не бывает хорошего, чтобы не пропустить объявления о кодировке и XML-версии. – Arnthor

+19

@Nordvind Я дал идею абхишеку амета не полное решение. Он не упомянул о любых требованиях к версии для Android. Декларация является основной вещью, поэтому любой разработчик Android напишет в * .xml-файле. ** Я сказал, что он будет работать во всех версиях android ?? ** Что не так с моим кодом? Если у вас есть одно и то же требование, вы используете мой ответ и у вас возникли проблемы, спросите меня, не комментируйте это. –

+1

@ Nordvind с другим примером того, как бесполезная система голосования SO. Слишком плохо, что нет возможности скомпенсировать комментарии. –

11
int id=100+1; 
layout.setId(id); 
+0

[Как упоминалось здесь] (http://stackoverflow.com/a/24721203/1221537), это решение будет генерировать ошибку проверки редактора (ожидаемый ресурс идентификатора типа), но он будет скомпилирован просто отлично. – adamdport

+3

На самом деле это не так. Если вы делаете int id = 100.apparently, если вы добавляете числа, он отлично работает. Не получилось, что xD –

+1

/спасибо @MateuszWinnicki, как ни странно, добавление сделало разницу. setId (100) не работает, но setId (99 + 1) действительно работает –

15

создать папку res/values/ids.xml и

<?xml version="1.0" encoding="utf-8"?> 

<resources> 
    <item name="refresh" type="id"/> 
    <item name="settings" type="id"/>   
</resources> 

в деятельности вызова класса как этот

ImageView refreshImg = new ImageView(activity); 
ImageView settingsImg = new ImageView(activity); 

    refreshImg.setId(R.id.refresh); 
    settingsImg .setId(R.id.settings); 
+2

Было задано вопрос о ** динамически ** созданном макете. – Arnthor

+5

Как это отличается от принятого ответа? –

+1

вот как ---> создать папку 'res/values ​​/ ids.xml' –

3

Если вы помещаете группу компонентов повторно в макет программно, как показано ниже:

<LinearLayout> 

     <ImageView> 
     <TextView> 
     <Button> 

     <ImageView> 
     <TextView> 
     <Button> 

     <ImageView> 
     <TextView> 
     <Button> 

     ... 
</LinearLayout> 

то, вы можете использовать цикл и дать идентификаторы соответственно:

for(int i=0;i<totalGroups;i++) 
{ 
    ImageView img; 
    TextView tv; 
    Button b; 

    ... // set other properties of above components 

    img.setId(i); 
    tv.setId(i); 
    b.setId(i); 

    ... //handle all events on these components here only 

    ... //add all components to your main layout 
} 

Или, если только один группу компонента, которую вы хотите добавить, вы можете использовать любое целое число, которое является большим и не конфликтует с идентификаторами других компонентов в ресурсах. Это не будет сильно противоречивым.

+3

Как получить значения textview и всех других компонентов? Пожалуйста, уточните подробнее. –

1

Вы можете определить свои Идентификаторы как ресурсы, а затем использовать setId(), чтобы установить его. В файле XML, определяет идентификаторы, как:

<resources> 
    <item type="id">your id name</item> 
</resources> 

затем, использование в файле Java, как ..

layout.setId(R.id.<your id name>) 
15

Google, наконец, осознал необходимость создания уникальных идентификаторов для программно созданного вида .. .

От уровня API 17 и выше, как только можно назвать View.generateViewId()

1

Попробуйте этот код! Это должно помочь дать представление.

activity_prac_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 

      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical"> 

<TextView 
    android:text="@string/edit_message" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/display_txt" 
    android:textStyle="bold" 
    android:textSize="18sp" 
    android:textAlignment="center" 
    android:layout_gravity="center_horizontal"/> 

<GridLayout 
    android:id="@+id/my_grid" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:rowCount="4"> 


<LinearLayout 
    android:orientation="vertical" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/linear_view"> 

    <Button 
     android:text="@string/button_send" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/my_btn" 
     android:layout_gravity="center_horizontal"/> 

    <TextView 
     android:text="@string/edit_message" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/my_txt" 
     android:textSize="18sp" 
     /> 

</LinearLayout> 
</GridLayout> 
</LinearLayout> 

вот остальная часть кода

public class AnotherActivity extends AppCompatActivity { 

private int count = 1; 

List<Integer> gridArray; 
private TextView myDisplayText; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    gridArray = new ArrayList<>(); 
    gridArray.add(Integer.valueOf(1)); 
    setContentView(R.layout.activity_prac_main); 



    findViews(); 


} 
private void findViews(){ 

    GridLayout gridLayout = (GridLayout)findViewById(R.id.my_grid); 
    gridLayout.setColumnCount(4); 
    LinearLayout linearLayout = (LinearLayout) gridLayout.findViewById(R.id.linear_view); 
    linearLayout.setTag("1"); 
    Button myButton = (Button) linearLayout.findViewById(R.id.my_btn); 
    myButton.setTag("1"); 
    TextView myText = (TextView) linearLayout.findViewById(R.id.my_txt); 
    myText.setText("1"); 

    myDisplayText = (TextView) findViewById(R.id.display_txt); 


    myButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      TextView txt = (TextView) view; 
      myDisplayText.setText("PRESS " + txt.getTag().toString()); 
      if(count < 24) { 

       createView(); 
      } 
      else{ 
       dialogBox(); 
      } 
     } 
    }); 
} 

private void createView(){ 

    LinearLayout ll = new LinearLayout(this); 
    ll.setId(Integer.valueOf(R.id.new_view_id)); 
    ll.setTag(String.valueOf(count+1)); 

    Button newBtn = createButton(); 
    newBtn.setId(Integer.valueOf(R.id.new_btn_id)); 
    newBtn.setTag(String.valueOf(count+1)); 

    TextView txtView = createText(); 
    txtView.setId(Integer.valueOf(R.id.new_txt_id)); 
    txtView.setTag(String.valueOf(count+1)); 
    txtView.setText(String.valueOf(count+1)); 

    GridLayout gridLayout = (GridLayout)findViewById(R.id.my_grid); 


    ll.addView(newBtn); 
    ll.addView(txtView); 
    ll.setOrientation(LinearLayout.VERTICAL); 

    gridLayout.addView(ll); 



     count++; 

} 

private Button createButton(){ 
    Button myBtn = new Button(this); 
    myBtn.setText(R.string.button_send); 
    myBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      TextView txt = (TextView) view; 
      myDisplayText.setText("PRESS " + txt.getTag().toString()); 
      if(count < 24) { 

       createView(); 
      } 
      else{ 
       dialogBox(); 
      } 
     } 
    }); 


    return myBtn; 
} 
public void dialogBox() { 
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); 
    alertDialogBuilder.setMessage("GRID IS FULL!"); 
    alertDialogBuilder.setPositiveButton("DELETE", 
      new DialogInterface.OnClickListener() { 

       @Override 
       public void onClick(DialogInterface arg0, int arg1) { 
        GridLayout gridLayout = (GridLayout)findViewById(R.id.my_grid); 
        gridLayout.removeAllViews(); 
        count = 0; 
        createView(); 

       } 
      }); 

    alertDialogBuilder.setNegativeButton("CANCEL", 
      new DialogInterface.OnClickListener() { 

       @Override 
       public void onClick(DialogInterface arg0, int arg1) { 

       } 
      }); 

    AlertDialog alertDialog = alertDialogBuilder.create(); 
    alertDialog.show(); 
} 
private TextView createText(){ 
    TextView myTxt = new TextView(this); 
    myTxt.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18); 

    return myTxt; 
} 

} 

Как вы можете видеть, идентификаторы были созданы в рес -> значения -> Идентификаторы файлов.

при создании представлений динамический идентификатор одинаковый для представлений.

Каждый TextView имеет один и тот же идентификатор. Каждая кнопка имеет один и тот же идентификатор. каждый макет разделяет один и тот же идентификатор.

Идентификаторы важны только для доступа к содержимому представлений.

Однако тег - это то, что делает каждый вид уникальным для каждого.

Надеюсь, это поможет вам!

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