【问题标题】:Get View ids in a for loop programatically?以编程方式在 for 循环中获取视图 ID?
【发布时间】:2014-08-12 07:20:51
【问题描述】:

我只是想知道。有没有办法使用 for 循环创建一个 id

我在 xml 中有 10 个按钮。 id 是button1,button2,button3... button10 现在我在java class 中创建一个按钮数组 并这样做

public class Menu extends Activity
{
    Button[] arrayButton=new Button[10];

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.menu);

        init();
    }

    private void init()
    {
        for(int i=1 ; i<9 ; i++)
        {
            String abc = "but"+String.valueof(i);
            int x = Integer.parseInt(abc);


            Log.d("abc", abc);

            Log.d("x", String.valueOf(x) );

            //arrayButton[i] = (Button) findViewById(R.id.x);  // giving error 

            //arrayButton[i].setText("Hello:");
        }
    }

}

我想知道我该怎么做这种工作。使用 for 循环获取所有按钮以使我的工作更快,并且有时我想设置所有按钮的文本。

【问题讨论】:

    标签: android view android-resources r.java-file android-identifiers


    【解决方案1】:

    getResources().getIdentifier点赞

    String abc = "but"+String.valueof(i);
    int resID = getResources().getIdentifier(abc, "id", getPackageName());
    arrayButton[i] = (Button) findViewById(resID );
    arrayButton[i].setText("Hello:");
    

    即只需将init() 方法重写为

    private void init()
        {
            for(int i=1 ; i<9 ; i++)
            {
                String abc = "but"+String.valueof(i);
                int resID = getResources().getIdentifier(abc, "id", getPackageName());
                arrayButton[i] = (Button) findViewById(resID);
                arrayButton[i].setText("Hello:");
            }
        }
    

    或者简单的你可以使用

        int[] buttonIDs = new int[] {R.id.but1, R.id.but2, R.id.but3,R.id.but4, ... }
        for(int i=0; i<buttonIDs.length; i++) {
            Button b = (Button) findViewById(buttonIDs[i]);
            b.setText("Hello:" + b.getText().toString());
    }
    

    【讨论】:

    • 现在,如果我想打开这样的活动,我该怎么做。我的意思是 startActivity("Activity"+i).. in a for 循环 ....有可能
    • @Nepster 但您可以一次开始一项活动,请描述具体情况。
    【解决方案2】:

    如果你已经知道所有的 id,你可以简单地使用:

    int [] ids = new int [] {R.id.btn1, R.id.btn2, ...};
    Button [] arrayButton = new Button[ids.length];
    
    for(int i=0 ; i < arrayButton.length ; i++)
    {
      arrayButton[i] = (Button) findViewById(ids[i]);
    }
    

    或者,如果您不认识它们,请使用:

    getResources().getIdentifier("btn1","id",getPackageName())
    

    【讨论】:

    • +1 现在,如果我想打开这样的活动,我该怎么做。我的意思是 startActivity("Activity"+i).. in a for 循环 ....有可能
    • 同理:Class [] classes = new Class [] {Activity1.class, Activity2.class, ...};
    • getResources().getClasses("btn1","id",getPackageName()) .. 任何其他类似的方法..
    • 不,你不能用这个。它仅适用于资源标识符。
    • 任何其他方式,例如获取类或在 PackageName 下获取类
    【解决方案3】:

    试试这个方法,希望能帮助你解决问题。

    ma​​in.xm

        <LinearLayout
            android:id="@+id/lnrMain"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical">
            <Button
                android:id="@+id/button1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
    
            <Button
                android:id="@+id/button2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
            <Button
                android:id="@+id/button3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
            <Button
                android:id="@+id/button4"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
            <Button
                android:id="@+id/button5"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
            <Button
                android:id="@+id/button6"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
            <Button
                android:id="@+id/button7"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
            <Button
                android:id="@+id/button8"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
            <Button
                android:id="@+id/button9"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
            <Button
                android:id="@+id/button10"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
        </LinearLayout>
    </LinearLayout>
    

    MainActvity.java

    public class MainActivity extends Activity {
    
        private LinearLayout lnrMain;
        private Button[] arrayButton;
    
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            lnrMain = (LinearLayout) findViewById(R.id.lnrMain);
            arrayButton=new Button[10];
            init();
        }
    
        private void init()
        {
            for(int i=0;i<lnrMain.getChildCount() ; i++)
            {
                arrayButton[i] = (Button) lnrMain.getChildAt(i);
                arrayButton[i].setText("Hello:"+(i+1));
            }
        }
    
    }
    

    【讨论】:

      【解决方案4】:

      你可以像这样创建一个辅助 void:

      public static int getResourceID(Context mContext, String StrId) {
          return mContext.getResources().getIdentifier(StrId, "id", mContext.getPackageName());
      }
      

      【讨论】:

        【解决方案5】:

        试试这个,这个例子是textview你可以根据你的要求定制它。

         public void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    rr = new RelativeLayout(this);
        
                    b1 = new Button(this);
                    b1.setId(R.id.Button01);
                    recent = b1;
                    b1.setText("Click me");
                    rr.addView(b1);               
                    setContentView(rr);        
                    b1.setOnClickListener(new View.OnClickListener() {
        
                        @Override
                        public void onClick(View v) {
                            tv1 = new TextView(can.this);
                            tv1.setId((int)System.currentTimeMillis());
                            lp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
                            lp.addRule(RelativeLayout.BELOW, recent.getId());
                            tv1.setText("Time: "+System.currentTimeMillis());
                            rr.addView(tv1, lp);
                            recent = tv1;
                        }
                    });
                }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-04-17
          • 2014-03-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-30
          相关资源
          最近更新 更多