[英]Unable To Change The Image Resource Of Image Button In A Grid View
我的应用程序中的GridView
由多个ImageButtons
组成。 轻按ImageButton
时,该ImageButton
的图像资源将更改。
当未点击ImageButton
时,这是图像资源ID的int数组。
private final int mineIcons[] =
{
R.drawable.habit,
R.drawable.story,
R.drawable.submenu_voice_message,
R.drawable.study,
R.drawable.guess,
R.drawable.poem,
R.drawable.add
};
轻按ImageButton
时,这是图像资源ID的int数组。
private final int mineIconsSelected[] =
{
R.drawable.habit_selected,
R.drawable.story_selected,
R.drawable.submenu_voice_message_selected,
R.drawable.study_selected,
R.drawable.guess_selected,
R.drawable.poem_selected,
R.drawable.add
};
加载此活动后,我希望GridView
中的第一个ImageButton
处于“轻击”状态。 所以我设置为默认图像资源的图像资源ID的这个int数组ImageButtons
的时候ImageButtons
被加载。
private final int mineIconsDefault[] =
{
R.drawable.habit_selected,
R.drawable.story,
R.drawable.submenu_voice_message,
R.drawable.study,
R.drawable.guess,
R.drawable.poem,
R.drawable.add
};
这是Fragment
的完整代码
公共类MineFragment扩展了Fragment {私有最终静态String LOG_TAG =“ MineFragment”;
private final int mineIcons[] =
{
R.drawable.habit,
R.drawable.story,
R.drawable.submenu_voice_message,
R.drawable.study,
R.drawable.guess,
R.drawable.poem,
R.drawable.add
};
private final int mineIconsSelected[] =
{
R.drawable.habit_selected,
R.drawable.story_selected,
R.drawable.submenu_voice_message_selected,
R.drawable.study_selected,
R.drawable.guess_selected,
R.drawable.poem_selected,
R.drawable.add
};
private SparseArray<ImageButton> submenuIconArray = new SparseArray<ImageButton>();
private SubMenuListAdapter submenuListAdapter = new SubMenuListAdapter();
private MineListAdapter mineListAdapter = new MineListAdapter();
private GridView gvSubmenu;
private ListView lvMine;
private int selectedItemNumber = 0;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.fragment_mine, container, false);
init(view);
return view;
}
private void init(View view)
{
lvMine = (ListView)view.findViewById(R.id.lv_mine);
lvMine.setAdapter(mineListAdapter);
gvSubmenu = (GridView)getActivity().findViewById(android.R.id.content).findViewById(R.id.gv_submenu);
gvSubmenu.setAdapter(submenuListAdapter);
}
public void showSubmenu()
{
if(gvSubmenu != null)
{
gvSubmenu.setVisibility(View.VISIBLE);
}
}
public void hideSubmenu()
{
if(gvSubmenu != null)
{
gvSubmenu.setVisibility(View.GONE);
}
}
private class SubMenuListAdapter extends BaseAdapter
{
private final int mineIconsDefault[] =
{
R.drawable.habit_selected,
R.drawable.story,
R.drawable.submenu_voice_message,
R.drawable.study,
R.drawable.guess,
R.drawable.poem,
R.drawable.add
};
@Override
public int getCount()
{
return mineIconsDefault.length;
}
@Override
public Object getItem(int position)
{
return mineIconsDefault[position];
}
@Override
public long getItemId(int arg0)
{
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup root)
{
if(convertView == null)
{
convertView = LayoutInflater.from(getActivity().getApplicationContext()).inflate(R.layout.list_item_submenu, root, false);
}
ImageButton ibSubmenuIcon = (ImageButton)convertView.findViewById(R.id.ib_item_submenu_icon);
ibSubmenuIcon.setImageResource(mineIconsDefault[position]);
ibSubmenuIcon.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View arg0)
{
submenuIconArray.get(selectedItemNumber).setImageResource(mineIcons[selectedItemNumber]);
submenuIconArray.get(position).setImageResource(mineIconsSelected[position]);
selectedItemNumber = position;
}
});
submenuIconArray.append(position, ibSubmenuIcon);
return convertView;
}
}
private class MineListAdapter extends BaseAdapter
{
//temp
private String[] tempListItems = {"item 1", "item 2", "item 3", "item 4", "item 5"};
@Override
public int getCount()
{
return tempListItems.length;
}
@Override
public Object getItem(int arg0)
{
return tempListItems[arg0];
}
@Override
public long getItemId(int arg0)
{
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup root)
{
if(convertView == null)
{
convertView = LayoutInflater.from(getActivity().getApplicationContext()).inflate(R.layout.list_item_layout_1, root, false);
}
ImageView ivItemIcon = (ImageView)convertView.findViewById(R.id.iv_item_icon);
TextView tvItemLabel = (TextView)convertView.findViewById(R.id.tv_item_label);
tvItemLabel.setText(tempListItems[position]);
return convertView;
}
}
}
我使用SparseArray
来存储GridView
加载的每个ImageButton
,以便稍后当我不得不更改ImageButton
的图像资源时,我只需要从SparseArray
获取该ImageButton
,然后将其图像资源设置为mineIconsSelected
的相应图像资源mineIconsSelected
整数数组。 在此之前,我将确保将我之前点击的ImageButton
的图像资源设置为mineIcons
int数组中的对应mineIcons
。
现在,奇怪的问题出现了。
我是能够成功地改变任何的图像资源ImageButton
存储在SparseArray
后攻, 除了 第一个。 无论我检查代码多少次,创建日志,都找不到问题所在。
请帮我。 非常感谢!
我强烈建议您先简化您的代码。 这样做之后,您的问题将消失或变得更容易调试。 因为您有这么多的按钮,所以前期工作可能有点乏味,但这会使您的代码更易于管理。 为每个按钮创建一个简单的选择器可绘制文件。 即对于习惯按钮:habit_selector.xml(放置在可绘制文件夹中)
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/habit" android:android:state_selected="true"/>
<item android:drawable="@drawable/habit_selected"/>
</selector>
然后将其设置在您的按钮上:
private final int mineIconSelectors[] =
{
R.drawable.habit_selector,
R.drawable.story_selector,
R.drawable.submenu_voice_message_selector,
...
}
...
ImageButton ibSubmenuIcon = (ImageButton)convertView.findViewById(R.id.ib_item_submenu_icon);
ibSubmenuIcon.setBackground(mineIconSelectors[position]);
因此,选择按钮后,Android会自动为您切换可绘制资产。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.