访问一个特定的布局中的按钮 [英] accessing the buttons of a specific layout
本文介绍了访问一个特定的布局中的按钮的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我已经有了一个答案:访问每一个布局的按钮
有关如何显示特定布局的所有的按钮,但我不明白的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屋!
查看全文