访问一个特定的布局中的按钮 [英] accessing the buttons of a specific layout

查看:144
本文介绍了访问一个特定的布局中的按钮的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经有了一个答案:访问每一个布局的按钮
有关如何显示特定布局的所有的按钮,但我不明白的code
这里是我如何努力,使其运行
该项目的其余部分是excatly与上述相同的链接
这里是我变了:

 包com.example.adapterlist;
进口的java.util.ArrayList;
进口的java.util.HashMap;
进口的java.util.Map;进口android.os.Bundle;
进口android.app.Activity;
进口android.util.Log;
进口android.view.View;
进口android.view.ViewGroup;
进口android.widget.AdapterView;
进口android.widget.AdapterView.OnItemClickListener;
进口android.widget.ArrayAdapter;
进口android.widget.Button;
进口android.widget.ListView;公共类MainActivity延伸活动{
    地图<字符串,整数> layoutIds =新的HashMap<字符串,整数>();
    ArrayList的<串GT; arrayForArrayAdapter;    @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);
        最终的ListView的ListView =(ListView控件)findViewById(R.id.mylist);
        java.lang.reflect.Field中的[] ID_Fields = R.layout.class.getFields();
        的String []值=新的String [ID_Fields.length]
        INT [] = resArray新INT [ID_Fields.length]
        的for(int i = 0; I< ID_Fields.length;我++){
            尝试{
                resArray [I] = ID_Fields [I] .getInt(NULL);
                值[I] = getResources()getResourceEntryName(resArray [I])。
                Log.v(resArray [I],getResources()getResourceEntryName(resArray [I]));            }赶上(抛出:IllegalArgumentException五){
                e.printStackTrace();
            }赶上(IllegalAccessException E){
                e.printStackTrace();
            }
        }
     ArrayAdapter<串GT;适配器=新ArrayAdapter<串GT;(这一点,
             android.R.layout.simple_list_item_1,android.R.id.text1,价值观);
             listView.setAdapter(适配器);
             listView.setOnItemClickListener(新OnItemClickListener(){
             @覆盖
             公共无效onItemClick(适配器视图<>为arg0,ARG1查看,
                        INT ARG2,长ARG3){
                    iJustClickedAnItemInTheList((字符串)listView.getSelectedItem());                }
             });
    }    私人无效iJustClickedAnItemInTheList(字符串idname){
        的setContentView(layoutIds.get(idname));
        ArrayList的<按钮和GT; allButtonsInLayout = getViewsFromViewGroup(findViewById(android.R.id.content),Button.class);
    }    公共静态< T> ArrayList的< T> getViewsFromViewGroup(查看根类< T> clazz所){
        ArrayList的< T>结果=新的ArrayList< T>();
        对于(查看视图:getAllViewsFromRoots(根))
            如果(clazz.isInstance(视图))
                result.add(clazz.cast(视图));
        返回结果;
    }    公共静态的ArrayList<视图> getAllViewsFromRoots(查看...根){
        ArrayList的<视图>结果=新的ArrayList<视图>();
        对于(查看根:根)
            getAllViews(结果,根);
        返回结果;
    }    私有静态无效getAllViews(ArrayList的<视图> allviews,查看父){
        allviews.add(父);
        如果(父的instanceof的ViewGroup){
            ViewGroup中的ViewGroup =(ViewGroup中)父母;
            的for(int i = 0; I< viewGroup.getChildCount();我++)
                getAllViews(allviews,viewGroup.getChildAt(I));
        }
      }
    }


解决方案

这个怎么样?唯一的一点是,你需要一个布局( /res/layout/listactivity.xml )以列表视图id为的ListView

 公共类MainActivity延伸活动{
    LV的ListView;
    的String [] layoutNames;
    INT [] layoutIds;    @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.listactivity);
        LV =(ListView控件)findViewById(R.id.listView);
    }    @覆盖
    保护无效onResume(){
        super.onResume();
        填();
        ArrayAdapter<串GT;适配器=新ArrayAdapter<串GT;(这一点,android.R.layout.simple_list_item_1,layoutNames);
        lv.setAdapter(适配器);
        lv.setOnItemClickListener(新OnItemClickListener(){
            @覆盖
            公共无效onItemClick(适配器视图<>为arg0,ARG1观,诠释ARG2,长ARG3){
                iJustClickedAnItemInTheList(ARG2);
            }
        });
    }    空隙填充(){
        java.lang.reflect.Field中的[] layoutFields = R.layout.class.getFields();
        layoutNames =新的String [layoutFields.length]
        layoutIds =新INT [layoutFields.length]
        的for(int i = 0; I< layoutFields.length;我++){
            尝试{
                layoutIds [I] = layoutFields [I] .getInt(NULL);
                layoutNames [I] = getResources()getResourceEntryName(layoutIds [I])。
            }赶上(抛出:IllegalArgumentException五){
                e.printStackTrace();
            }赶上(IllegalAccessException E){
                e.printStackTrace();
            }
        }
    }    私人无效iJustClickedAnItemInTheList(INT位置){
        的setContentView(layoutIds [位置]);
        ArrayList的<按钮和GT; allButtonsInLayout = getViewsFromViewGroup(findViewById(android.R.id.content),Button.class);
        Toast.makeText(这一点,+ allButtonsInLayout.size(),Toast.LENGTH_SHORT).show();
    }    公共静态< T> ArrayList的< T> getViewsFromViewGroup(查看根类< T> clazz所){
        ArrayList的< T>结果=新的ArrayList< T>();
        对于(查看视图:getAllViewsFromRoots(根))
            如果(clazz.isInstance(视图))
                result.add(clazz.cast(视图));
        返回结果;
    }    公共静态的ArrayList<视图> getAllViewsFromRoots(查看...根){
        ArrayList的<视图>结果=新的ArrayList<视图>();
        对于(查看根:根)
            getAllViews(结果,根);
        返回结果;
    }    私有静态无效getAllViews(ArrayList的<视图> allviews,查看父){
        allviews.add(父);
        如果(父的instanceof的ViewGroup){
            ViewGroup中的ViewGroup =(ViewGroup中)父母;
            的for(int i = 0; I< viewGroup.getChildCount();我++)
                getAllViews(allviews,viewGroup.getChildAt(I));
        }
    }
}

i've got an answer:accessing buttons of every layout about how to display all the buttons of a specific layout but i don't understand the code here is how i try to make it run the rest of the project is excatly the same as the link above here is what i changed:

package com.example.adapterlist;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;

public class MainActivity extends Activity {
    Map<String, Integer> layoutIds = new HashMap<String, Integer>();
    ArrayList<String> arrayForArrayAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final ListView listView = (ListView) findViewById(R.id.mylist);
        java.lang.reflect.Field[] ID_Fields = R.layout.class.getFields();
        String []values=new String[ID_Fields.length];
        int[] resArray = new int[ID_Fields.length];
        for(int i = 0; i < ID_Fields.length; i++){
            try {
                resArray[i] = ID_Fields[i].getInt(null);
                values[i]=getResources().getResourceEntryName(resArray[i]);
                Log.v("resArray[i]  " , getResources().getResourceEntryName(resArray[i]));

            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
             android.R.layout.simple_list_item_1, android.R.id.text1, values);
             listView.setAdapter(adapter);
             listView.setOnItemClickListener(new OnItemClickListener(){
             @Override
             public void onItemClick(AdapterView<?> arg0, View arg1,
                        int arg2, long arg3) {
                    iJustClickedAnItemInTheList((String) listView.getSelectedItem());



                }
             });


    }

    private void iJustClickedAnItemInTheList(String idname) {
        setContentView(layoutIds.get(idname));
        ArrayList<Button> allButtonsInLayout = getViewsFromViewGroup(findViewById(android.R.id.content), Button.class);
    }

    public static <T> ArrayList<T> getViewsFromViewGroup(View root, Class<T> clazz) {
        ArrayList<T> result = new ArrayList<T>();
        for (View view : getAllViewsFromRoots(root)) 
            if (clazz.isInstance(view)) 
                result.add(clazz.cast(view));
        return result;
    }

    public static ArrayList<View> getAllViewsFromRoots(View...roots) {
        ArrayList<View> result = new ArrayList<View>();
        for (View root : roots)
            getAllViews(result, root);
        return result;
    }

    private static void getAllViews(ArrayList<View> allviews, View parent) {
        allviews.add(parent);
        if (parent instanceof ViewGroup) {
            ViewGroup viewGroup = (ViewGroup)parent;
            for (int i = 0; i < viewGroup.getChildCount(); i++)
                getAllViews(allviews, viewGroup.getChildAt(i));
        }
      }


    }

解决方案

How about this? only thing is, you need a layout (/res/layout/listactivity.xml) with a listview whose id is listView.

public class MainActivity extends Activity {
    ListView lv;
    String[] layoutNames;
    int[] layoutIds;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listactivity);
        lv = (ListView)findViewById(R.id.listView);
    }

    @Override
    protected void onResume() {
        super.onResume();
        fill();
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, layoutNames);
        lv.setAdapter(adapter);
        lv.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
                iJustClickedAnItemInTheList(arg2);
            }
        });
    }

    void fill() {
        java.lang.reflect.Field[] layoutFields = R.layout.class.getFields();
        layoutNames = new String[layoutFields.length];
        layoutIds = new int[layoutFields.length];
        for(int i = 0; i < layoutFields.length; i++){
            try {
                layoutIds[i] = layoutFields[i].getInt(null);
                layoutNames[i] = getResources().getResourceEntryName(layoutIds[i]);
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }

    private void iJustClickedAnItemInTheList(int position) {
        setContentView(layoutIds[position]);
        ArrayList<Button> allButtonsInLayout = getViewsFromViewGroup(findViewById(android.R.id.content), Button.class);
        Toast.makeText(this, "" + allButtonsInLayout.size(), Toast.LENGTH_SHORT).show();
    }

    public static <T> ArrayList<T> getViewsFromViewGroup(View root, Class<T> clazz) {
        ArrayList<T> result = new ArrayList<T>();
        for (View view : getAllViewsFromRoots(root)) 
            if (clazz.isInstance(view)) 
                result.add(clazz.cast(view));
        return result;
    }

    public static ArrayList<View> getAllViewsFromRoots(View...roots) {
        ArrayList<View> result = new ArrayList<View>();
        for (View root : roots)
            getAllViews(result, root);
        return result;
    }

    private static void getAllViews(ArrayList<View> allviews, View parent) {
        allviews.add(parent);
        if (parent instanceof ViewGroup) {
            ViewGroup viewGroup = (ViewGroup)parent;
            for (int i = 0; i < viewGroup.getChildCount(); i++)
                getAllViews(allviews, viewGroup.getChildAt(i));
        }
    }
}

这篇关于访问一个特定的布局中的按钮的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆