Android自定义UI陷阱 LayoutInflater from inflate 一定不能工作在父类或虚类里
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
问题背景:有一些UI具有共性,比如常见的app第一次运行时出现的各种指示框,告诉你往哪搓是调音量的,往哪点是调屏幕亮度的,当点击这些VIew,则其自动消失。或者一动时间后,自动消失。另外一个问题是,不同的方向下加载出来的指示View内容是不一样的。
为此需要将这些特点的View抽象出来,写个父类或者说是基类,为啥一定要这样搞,这样写好处很多。优点如下:
1、可以让代码变得更简洁。每个子View里的共同的方法都由父类来做,每个子View实现自己的逻辑就ok了。
2、因为这些View只工作一次,所以写死在主UI的xml里显得不合时宜,动态添加是最好的。因为牵涉到旋转方向问题,就必须要提前给出这些View的实例化变量名称。如果互相之间是完全是独立的,则需要定义View1 view1, View2 view2...很多个View,然后方向发生变化时挨个通知。如果有个BaseView, View1和View2...都是继承自BaseView,则只需定义BaseView baseView,需要显示时用BaseView实例化具体的是View1 还是View2.如: baseView = new View1(...).然后方向变化时判断baseView是否为空,然后把方向告诉它就ok了。
先来看上面提到的BaseView,这里命名为BaseGuideView:
package org.yanzi.ui;import org.yanzi.util.OrientationUtil;import android.content.Context;import android.view.MotionEvent;import android.view.View;import android.widget.RelativeLayout;import android.widget.TextView;public abstract class BaseGuideView extends RelativeLayout implements Rotatable, View.OnClickListener { protected int mOrientation = 0; protected Context mContext; private GuideViewCallback mGuideViewCallback; public interface GuideViewCallback{ public void onGuideViewClick(); } public BaseGuideView(Context context, GuideViewCallback callback) { super(context); // TODO Auto-generated constructor stub mContext = context; mGuideViewCallback = callback; setOnClickListener(this); mOrientation = OrientationUtil.getOrientation(); } @Override public void setOrientation(int orientation, boolean animation) { // TODO Auto-generated method stub mOrientation = orientation; requestLayout(); } protected abstract void initView(); @Override public boolean onInterceptTouchEvent(MotionEvent ev) { // TODO Auto-generated method stub return true; //super.onInterceptTouchEvent(ev) } @Override public void onClick(View v) { // TODO Auto-generated method stub mGuideViewCallback.onGuideViewClick(); }}
最重要一点是我再onInterceptTouchEvent里把点击事件给消费了,这样布局里的孩子就接收不到点击了。然后写了一个GuideViewCallback,当被点击时,会触发onGuideViewClick,这个接口的实现在另一个地方,如集中管理Ui的地方。将这个弹框再消失。另外,就是每次方向发生改变都会执行requestLayout,重新执行view的onMeasure和onLayout.
再定义个NanShiGuide.java继承自上面的类:
package org.yanzi.ui;import com.example.test1.R;import android.content.Context;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.widget.TextView;public class NanShiGuide extends BaseGuideView { int LAYOUT_ID = R.layout.c_nanshi_guide; View guideNanLayout; TextView guideNanText; public NanShiGuide(Context context, GuideViewCallback callback) { super(context, callback); // TODO Auto-generated constructor stub initView(); } @Override protected void initView() { // TODO Auto-generated method stub Log.i("YanZi", "NanShiGuide initView enter..."); View v = LayoutInflater.from(mContext).inflate(LAYOUT_ID, this, true); guideNanLayout = v.findViewById(R.id.guide_nan_layout); guideNanText = (TextView) v.findViewById(R.id.guide_nan_text); Log.i("YanZi", "NanShiGuide initView exit..."); }}
在这个子类里就可以将资源加载进来了。对应的布局c_nanshi_guide.xml:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" ><FrameLayout android:id="@+id/guide_nan_layout" android:layout_width="200dip" android:layout_height="150dip" android:background="@drawable/nan1"> <TextView android:id="@+id/guide_nan_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:layout_gravity="bottom|center_horizontal" android:textColor="@android:color/white" android:textSize="20sp" android:text="南公怀瑾."/> </FrameLayout> </RelativeLayout>
在initView函数里将xml加载进来并获得各个控件的实例,我所遇到的问题是,如果这个initView()写在基类(也是个虚类)BaseGuideView的构造函数里,是不能够正常运行的。虽然initView()函数执行了,但是会报错:
07-06 15:17:58.258 I/YanZi ( 8375): NanShiGuide initView enter...07-06 15:17:58.258 W/ResourceType( 8375): No package identifier when getting value for resource number 0x0000000007-06 15:17:58.258 D/AndroidRuntime( 8375): Shutting down VM07-06 15:17:58.258 W/dalvikvm( 8375): threadid=1: thread exiting with uncaught exception (group=0x410899a8)
找不到package的指针。按理说从java的语法上是完全可以这么用的,虚类调一个虚方法,虚方法由各个子类具体实现,但这里报错了。原因是因为:
View v = LayoutInflater.from(mContext).inflate(LAYOUT_ID, this, true);
这里有个this指针的问题,当initVIew()让虚类调用时,这个this指向谁?是虚类自己还是子类?正因此才挂了,另外这个inflate本身就有一定特殊性,是不能随便乱用this的。我尝试过把BaseGuideView里的initView不写成虚的,而是一个空的函数,依旧是报错。所以遇到这种情况,加载布局一定由各个子View自行加载并初始化是最好的。
效果如下,左上角的图片就是特意显示的,同时将背景变暗:
给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
![](/assets/blank.gif)
Android自定义UI陷阱 LayoutInflater from inflate 一定不能工作在父类或虚类里相关推荐
- Android自定义UI陷阱:LayoutInflater.from().inflate()一定不能工作在父类或虚类里
问题背景:有一些UI具有共性,比如常见的app第一次运行时出现的各种指示框,告诉你往哪搓是调音量的,往哪点是调屏幕亮度的,当点击这些VIew,则其自动消失.或者一动时间后,自动消失.另外一个问题是,不 ...
- android自定义UI模板图文详解
不知道大家在实际开发中有没有自定义过UI模板?今天花时间研究了一下android中自定义UI模板,与大家分享一下. 每个设计良好的App都是自定义标题栏,在自定义标题栏的过程中大部分人可能都是自定义一 ...
- Android 自定义UI 实战 02 流式布局
Android 自定义UI 实战 02 流式布局-- 自定义ViewGroup 第二章 自定义ViewGroup 流式布局 文章目录 Android 自定义UI 实战 02 流式布局-- 自定义Vie ...
- Android自定义UI实例
下面开始实现一个闪屏的效果,首先自定义类继承于View,然后重写onDraw方法,之前使用onDraw方法可以绘图,但是只是绘制一次,那如何实现循环呢.很容易想到使用invalidate()这个方法, ...
- android手势密码源码,Android自定义UI手势密码改进版源码下载
在之前文章的铺垫下,再为大家分享一篇:Android手势密码,附源码下载,不要错过. 先看第一张图片的布局文件 activity_main.xml xmlns:tools="http://s ...
- android简单登录自定义密码,Android自定义UI手势密码简单版
先看看效果图: ImageLockActivity package com.example.imagelock; import com.example.view.NinePointLineView; ...
- Android自定义UI实战(基础篇3)---图标圆弧运动
先上效果: 实现基本步骤: 1.背景和圆弧的绘制:在此使用到背景图片如下,我们可以根据需求更换成自己的图片 2.图标源着圆弧绘制 3.左滑,右滑的处理 一 .圆弧背景的实现 关于背景的截取,在此使用B ...
- android 自定义悬浮框,Android自定义悬浮窗
FloatWindow readme-中文 Android自定义悬浮窗 原理很简单,就是借用了WindowManager这个管理类来实现的. 1.首先在AndroidManifest.xml中添加使用 ...
- 自定义UI 基础知识
系列文章目录 HenCode报名链接:hencoder.ke.qq.com 自定义UI 基础知识 自定义UI 绘制饼图 自定义UI 圆形头像 自定义UI 自制表盘 自定义UI 简易图文混排 自定义UI ...
最新文章
- java 文本压缩_[Java基础]Java使用GZIP进行文本压缩
- [转]Java8-本地缓存
- QT配置opencv开发环境
- IoTSharp 2.0 发布
- 《走遍中国》珍藏版(四)
- python安装完毕后,用pip安装,提示找不到ssl模块
- MySQL常用命令操作大全
- 计算机应用技术参加文献,面向科技文献的机器翻译(4)-计算机应用技术专业毕业论文.docx...
- 第五章 APP元素定位
- Linux后台运行程序
- C语言 使用DFT得到信号幅度谱
- SAP与ERP的区别联系
- qlv是什么格式的视频,怎么把qlv格式转换成mp4
- Excel 多个条件同时重复时,自动标红
- EDK II工程文档官方网址
- 秘钥认证登录CentOS 7
- 斯坦福大学已经训练好的词向量模型下载网址
- 快速完成批量图片压缩,你需要这款图片压缩神器!
- springboot 集成支付宝支付
- android 用MyTV等第三方应用播放直播视频,只有声音没有画面