安卓自定义actionbar,怎么设置监听事件,急急急
用CustomView。
layout:
部分代码:
View customView = LayoutInflater.from(this).inflate(R.layout.back, new LinearLayout(this), false);
getActionBar().setDisplayShowCustomEnabled(true);
getActionBar().setCustomView(customView);
customView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "....", 10000).show();
}
});
我自己测试过,暂无出现问题。
layoutinflater.inflate 和 view.inflate 的区别
平时ListView加载item中,adapter的getView方法中,我们经常用到:
LayoutInflater.from(mContext).inflate(R.layout.it,parent,false);
这样的方法来加载布局xml,平时一直就是这么用的,也没什么疑问。
今天网上看了个自定义布局的源码,自定义布局中加载布局xml用的View.inflate方法:
public class SettingItemView extends RelativeLayout {
private CheckBox cb_status;
private _description;
private _title;
private String desc_on;
private String desc_off;
private void iniView(Context context) {
View.inflate(context, R.layout.setting_item_view, this);//第三个参数传布局文件的父类
cb_status=(CheckBox) this.findViewById(R.id.cb_status);
tv_description=(TextView) this.findViewById(_description);
tv_title=(TextView) this.findViewById(_title);
}
第一次见用这种方式来加载布局的,看了下他的iew加载item,也是用这种方式:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view;
ViewHolder holder;
if(convertView==null){
view=View.inflate(getApplicationContext(), R.layout.list_item_callsms, null);//最后一个传了null
holder=new ViewHolder();
_number=(TextView) view.findViewById(_black_number);
_mode=(TextView) view.findViewById(_black_mode);
holder.iv_delete=(ImageView) view.findViewById(R.id.iv_delete);
view.setTag(holder);
好吧,看一下View.inflate的说明:
Open Declaration View android.view.View.inflate(Context context, int resource, ViewGroup root)
Inflate a view from an XML resource. This convenience method wraps the
LayoutInflater class, which provides a full range of options for view
inflation.
Parameters: context The Context object for your activity or
application. resource The resource ID to inflate root A view group
that will be the parent. Used to properly inflate the layout_*
parameters.
See Also: LayoutInflater
最后有一句让你看LayoutInflater这个类,怀疑它内部也是用LayoutInflater实现的,进入源码:
public static View inflate(Context context, int resource, ViewGroup root) {
LayoutInflater factory = LayoutInflater.from(context);
return factory.inflate(resource, root);
}
果然内部也是用LayoutInflater实现的,不知道为啥android还要用View.inflat封装一下。
。
。
o(〃’▽’〃)o
其中LayoutInflater的Inflate的三个参数意思为:
对于Inflate的三个参数(int resource, ViewGroup root, boolean attachToRoot)
如果inflate(layoutId, null )则layoutId的最外层的控件的宽高是没有效果的
如果inflate(layoutId, root, false ) 则认为和上面效果是一样的
如果inflate(layoutId, root, true ) 则认为这样的话layoutId的最外层控件的宽高才能正常显示
对这三个参数区别不理解的话可以看这篇文章:
inflate第三个参数意思
从源码角度解析的有郭大神的:
Android LayoutInflater原理分析,带你一步步深入了解View(一)
以及另一篇感觉很不错的:
Android LayoutInflate深度解析 给你带来全新的认识
看完,你应该知道这个参数意思了,ok,再来看上面代码, 这时就可以替换为layoutInflater的方式了:
对于第一个自定义布局:
//View.inflate(context, R.layout.setting_item_view, this);//第三个参数传布局文件的父类
LayoutInflater.from(context).inflate(R.layout.setting_item_view, this, true);//等价于上面
第二个适配器中getView:
//view=View.inflate(getApplicationContext(), R.layout.list_item_callsms, null);
view=LayoutInflater.from(getApplicationContext()).inflate(R.layout.list_item_callsms,parent,false);android LayoutInflater 获取不到控件
这个是获取不到的,因为这个iew没有实际被调用。
但是编译时R文件中确实有这个iew的id值,所以编译什么的都不会报错。
如果你需要获取其中的值,就在Intent中绑定数据。
或者更改它显示内容的话,就在MainActivity中动态注册个广播接收器,从现在这个广播接收器接受广播,并改变TextView的显示内容。
如何判断infowindow当前是打开还是关闭状态
您好,很高兴为您解答,我是用的如下方法: View view=LayoutInflater.from(this).inflate(R.layout.alter_view,null); mInfoWindow = new InfoWindow(view, llInfo, listener); 如果我的回答没能帮助您,请继续追问。
转载,仅供参考。
小白求助:在ViewSwitcher中的setfactroy和其中的makeview方法有什么作用,还有factory是什么?
ViewSwitcher 代表了视图切换组件, 本身继承了FrameLayout ,可以将多个View叠在一起 ,每次只显示一个组件.当程序控制从一个View切换到另个View时,ViewSwitcher 支持指定动画效果.
为了给ViewSwitcher 添加多个组件, 一般通过ViewSwitcher 的setFactory 方法为止设置ViewFactory ,并由ViewFactory为之创建View 即可.
下面通过一个实例来介绍 ViewFactory的用法.(仿Android系统Launcher 界面 实现分屏 左右滑动效果)
import java.util.ArrayList;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.ViewSwitcher;
import android.widget.ViewSwitcher.ViewFactory;
public class ViewSwitcherTest extends Activity
{
// 定义一个常量,用于显示每屏显示的应用程序数
public static final int NUMBER_PER_SCREEN = 12;
// 代表应用程序的内部类,
public static class DataItem
{
// 应用程序名称
public String dataName;
// 应用程序图标
public Drawable drawable;
}
// 保存系统所有应用程序的List集合
private ArrayList items = new ArrayList();
// 记录当前正在显示第几屏的程序
private int screenNo = -1;
// 保存程序所占的总屏数
private int screenCount;
ViewSwitcher switcher;
// 创建LayoutInflater对象
LayoutInflater inflater;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
inflater = LayoutInflater.from(ViewSwitcherTest.this);
// 创建一个包含40个元素的List集合,用于模拟包含40个应用程序
for (int i = 0; i < 40; i++)
{
String label = "" + i;
Drawable drawable = getResources().getDrawable(
R.drawable.ic_launcher);
DataItem item = new DataItem();
item.dataName = label;
item.drawable = drawable;
items.add(item);
}
// 计算应用程序所占的总屏数。
// 如果应用程序的数量能整除NUMBER_PER_SCREEN,除法的结果就是总屏数。
// 如果不能整除,总屏数应该是除法的结果再加1。
screenCount = items.size() % NUMBER_PER_SCREEN == 0 ?
items.size()/ NUMBER_PER_SCREEN :
items.size() / NUMBER_PER_SCREEN + 1;
switcher = (ViewSwitcher) findViewById(R.id.viewSwitcher);
switcher.setFactory(new ViewFactory()
{
// 实际上就是返回一个GridView组件
@Override
public View makeView()
{
// 加载iew组件,实际上就是一个GridView组件。
return inflater.inflate(iew, null);
}
});
// 页面加载时先显示第一屏。
next(null);
}
public void next(View v)
{
if (screenNo < screenCount - 1)
{
screenNo++;
// 为ViewSwitcher的组件显示过程设置动画
switcher.setInAnimation(this, R.anim.slide_in_right);
// 为ViewSwitcher的组件隐藏过程设置动画
switcher.setOutAnimation(this, R.anim.slide_out_left);
// 控制下一屏将要显示的GridView对应的 Adapter
((GridView) switcher.getNextView()).setAdapter(adapter);
// 点击右边按钮,显示下一屏,也可通过手势检测实现显示下一屏.
switcher.showNext();
}
}
public void prev(View v)
{
if (screenNo > 0)
{
screenNo--;
// 为ViewSwitcher的组件显示过程设置动画
switcher.setInAnimation(this, android.R.anim.slide_in_left);
// 为ViewSwitcher的组件隐藏过程设置动画
switcher.setOutAnimation(this, android.R.anim.slide_out_right);
// 控制下一屏将要显示的GridView对应的 Adapter
((GridView) switcher.getNextView()).setAdapter(adapter);
// 点击左边按钮,显示上一屏,也可通过手势检测实现显示上一屏.
switcher.showPrevious();
}
}
// 该BaseAdapter负责为每屏显示的GridView提供列表项
private BaseAdapter adapter = new BaseAdapter()
{
@Override
public int getCount()
{
// 如果已经到了最后一屏,且应用程序的数量不能整除NUMBER_PER_SCREEN
if (screenNo == screenCount - 1
&& items.size() % NUMBER_PER_SCREEN != 0)
{
// 最后一屏显示的程序数为应用程序的数量对NUMBER_PER_SCREEN求余
return items.size() % NUMBER_PER_SCREEN;
}
// 否则每屏显示的程序数量为NUMBER_PER_SCREEN
return NUMBER_PER_SCREEN;
}
@Override
public DataItem getItem(int position)
{
// 根据screenNo计算第position个列表项的数据
return items.get(screenNo * NUMBER_PER_SCREEN + position);
}
@Override
public long getItemId(int position)
{
return position;
}
@Override
public View getView(int position
, View convertView, ViewGroup parent)
{
View view = convertView;
if (convertView == null)
{
// 加载R.layout.labelicon布局文件
view = inflater.inflate(R.layout.labelicon, null);
}
// 获取R.layout.labelicon布局文件中的ImageView组件,并为之设置图标
ImageView imageView = (ImageView)
view.findViewById(R.id.imageview);
imageView.setImageDrawable(getItem(position).drawable);
// 获取R.layout.labelicon布局文件中的TextView组件,并为之设置文本
TextView textView = (TextView)
view.findViewById(iew);
textView.setText(getItem(position).dataName);
return view;
}
};
}setTag的作用是什么?
这个东西在一些需要用到Adapter自定控件显示方式的时候非常有用Adapter 有个getView方法,可以使用setTag把查找的view缓存起来方便多次重用public View getView(int position, View convertView, ViewGroup parent) { ViewHolder vh; if (convertView == null) { LayoutInflater inflater = (LayoutInflater) mWidgetsSwitchApp .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.app_gallery_item, null); vh = new ViewHolder(); vh.view1 = (ImageView) convertView.findViewById(R.id.view1); vh.view2 = (ImageView) convertView.findViewById(R.id.view2); vh.view3= (ImageView) convertView.findViewById(R.id.view3); vh.view4 = (ImageView) convertView.findViewById(R.id.view4); convertView.setTag(vh); } else { vh = (ViewHolder) convertView.getTag(); }//其他的代码可以直接使用 vh.view1、vh.view2、vh.view3 、vh.view4}
10gbiz怎么样?10gbiz在本站也多次分享过,是一家成立于2020的国人主机商家,主要销售VPS和独立服务器,机房目前有中国香港和美国洛杉矶、硅谷等地,线路都非常不错,香港为三网直连,电信走CN2,洛杉矶线路为三网回程CN2 GIA,10gbiz商家七月连续推出各种优惠活动,除了延续之前的VPS产品4折优惠,目前增加了美国硅谷独立服务器首月半价的活动,有需要的朋友可以看看。10gbiz优惠码...
今天中午的时候有网友联系到在选择网站域名建站和主机的时候问到域名和IP地址有没有关联,或者需要注意的问题。毕竟我们在需要建站的时候,我们需要选择网站域名和主机,而主机有虚拟主机,包括共享和独立IP,同时还有云服务器、独立服务器、站群服务器等形式。通过这篇文章,简单的梳理关于网站域名和IP之间的关系。第一、什么是域名所谓网站域名,就是我们看到的类似"www.laozuo.org",我们可以通过直接记...
HostNamaste是一家成立于2016年3月的印度IDC商家,目前有美国洛杉矶、达拉斯、杰克逊维尔、法国鲁贝、俄罗斯莫斯科、印度孟买、加拿大魁北克机房。其中洛杉矶是Quadranet也就是我们常说的QN机房(也有CC机房,可发工单让客服改机房);达拉斯是ColoCrossing也就是我们常说的CC机房;杰克逊维尔和法国鲁贝是OVH的高防机房。采用主流的OpenVZ和KVM架构,支持ipv6,免...
layoutinflater为你推荐
createfile失败惠普机看机提示create file fail 无法进桌面一起作业网站一起作业官网是什么?ico监管为何央行叫停代币发行?上行宽带上行宽带是什么?防火墙技术应用在网络支付流程中,防火墙技术与数据加密技术应用则重点有什么不同?东兴证券网站东兴证券交易软件如何操作?怎么查微信注册时间怎么查对方的微信号什么时候注册的怎样删除聊天记录怎么批量清除微信聊天记录空间导航怎么把空间的导航变成只有留言板跟相册短信套餐移动有什么短信包月套餐,怎么开通?
域名管理 vps优惠码 vps优惠码cnyvps 站群服务器 kdata mediafire下载 日志分析软件 http500内部服务器错误 移动服务器托管 空间登陆首页 服务器防火墙 服务器托管价格 闪讯网 accountsuspended htaccess 时间同步服务器 达拉斯 9929 nano cc攻击 更多