android学习笔记1

来源:互联网 发布:淘宝七星彩摇奖机 编辑:程序博客网 时间:2024/06/05 03:42
1.findViewById()
通常是activity和dialog可以直接这样用,因为本身有setContentView(),父类设置了此方法
Service是没有视图的,不能直接使用findViewById,如果你inflate了一个View对象,
可以写成view.findViewById,view就是你加载的View对象
2.LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;
而findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。
具体作用:
  1、对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入;
  2、对于一个已经载入的界面,就可以使用Activiyt.findViewById()方法来获得其中的界面元素。
LayoutInflater 是一个抽象类,在文档中如下声明:
public abstract class LayoutInflater extends Object
获得 LayoutInflater 实例的三种方式
   1. LayoutInflater inflater = getLayoutInflater();//调用Activity的getLayoutInflater() 
   2. LayoutInflater inflater = LayoutInflater.from(context);  
   3. LayoutInflater inflater =  (LayoutInflater)context.getSystemService
                              (Context.LAYOUT_INFLATER_SERVICE);
3.android不允许开发者启动线程访问用户界面ui组件。
4.gridlayout用不了:在Androidmanifest.xml里面把
<uses-sdk
android:minSdkVersion="8"<--! 把8改成14就好了-->
android:targetSdkVersion="18" />
5.在Activity中静态使用fragment的时候,要注意两个地方。
Fragment引用的包是:
import android.support.v4.app.Fragment;
而不是:
import android.app.Fragment;


然后Activity必须是继承FragmentActivity
import android.support.v4.app.FragmentActivity;


不然就会出现这个错误。
6. Android运行时异常“Binary XML file line # : Error inflating class”
    1. 引用类名问题:自定义了一个View,将他用于布局文件中,假设他的包名叫MyPackage,类名叫MyTestView,
       这个时候你在XML作为布局元素来布局的话,必须使用完整路径名,也就是包名加类名来引用,用MyPackage.MyTestView来进行引用。
    2.构造函数问题:自定义一个View,必须派生实现基类View的三个构造函数
      View(Context context)     //Simple constructor to use when creating a view from code
      View(Context context, AttributeSet attrs)     //Constructor that is called when inflating a view from XML
      View(Context context, AttributeSet attrs, int defStyle)     //Perform inflation from XML and apply a class-specific base style
      从文档上的介绍来看,第二个和第三个构造函数对于XML这种引用方式是必须实现的,
      这三个构造函数应该是在不同的应用场合来实例化一个View对象。
    3.编译的中间文件没有清理干净:第三种就是你在原生系统代码的编译环境下编译APK之后,特别是修改了XML,
      出现标题所述现象,这个时候你只需要删除out目录下编译生成的中间文件夹即可(具体名字记不清了:在编译过程中,
      系统会将那个位置打印出来,通过串口来看吧,.../out/....../..../classes.dex,你循着这个路径往前推到你的应用的project名字
      那一层文件夹),删除再重新make就OK了。
    4.找不到资源文件:我原来在2.3的原生系统增加动态壁纸的时候,动态壁纸一跑起来就出这个异常,然后crash,
      当时就是因为找不到drawable的资源文件,于是当时我把drawable的hdpi或nodpi等文件夹的图片资源都拷贝一份到drawble下,
      问题解决(当时一直不明白系统会根据分辨率来选择加载不同drawable下文件夹的资源,为什么这里必须放入drawable中)。
7.if(str_subID!=null && !"".equals(str_subID))是什么意思
  str_subID 不为空,且不为空串. 
  为空是 str_subID 是根本没有值,这个时候用这个值去做运算很容易抛空指针错误. 
  为空串 "" 是有值,但是这个值是一个空串,, 在拼接字符串的时候不这么判断就用也会引起sql执行错误


8.synchronized
     一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。


     二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。


     三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。


     四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。


     五、以上规则对其它对象锁同样适用.
9.有些时候我们使用Service的时需要采用隐私启动的方式,但是Android 5.0一出来后,
  其中有个特性就是Service Intent  must be explitict,也就是说从Lollipop开始,service服务必须采用显示方式启动。
     解决方式:
  Intent mIntent = new Intent();
  mIntent.setAction("XXX.XXX.XXX");//你定义的service的action
  mIntent.setPackage(getPackageName());//这里你需要设置你应用的包名
  context.startService(mIntent);


10.获取android手机当前ip地址
public class NetWorkUtils {  
  
    /** 
     * 检查网络是否可用 
     *  
     * @param paramContext 
     * @return 
     */  
    public static boolean checkEnable(Context paramContext) {  
        boolean i = false;  
        NetworkInfo localNetworkInfo = ((ConnectivityManager) paramContext  
                .getSystemService("connectivity")).getActiveNetworkInfo();  
        if ((localNetworkInfo != null) && (localNetworkInfo.isAvailable()))  
            return true;  
        return false;  
    }  
  
    /** 
     * 将ip的整数形式转换成ip形式 
     *  
     * @param ipInt 
     * @return 
     */  
    public static String int2ip(int ipInt) {  
        StringBuilder sb = new StringBuilder();  
        sb.append(ipInt & 0xFF).append(".");  
        sb.append((ipInt >> 8) & 0xFF).append(".");  
        sb.append((ipInt >> 16) & 0xFF).append(".");  
        sb.append((ipInt >> 24) & 0xFF);  
        return sb.toString();  
    }  
  
    /** 
     * 获取当前ip地址 
     *  
     * @param context 
     * @return 
     */  
    public static String getLocalIpAddress(Context context) {  
        try {  
            // for (Enumeration<NetworkInterface> en = NetworkInterface  
            // .getNetworkInterfaces(); en.hasMoreElements();) {  
            // NetworkInterface intf = en.nextElement();  
            // for (Enumeration<InetAddress> enumIpAddr = intf  
            // .getInetAddresses(); enumIpAddr.hasMoreElements();) {  
            // InetAddress inetAddress = enumIpAddr.nextElement();  
            // if (!inetAddress.isLoopbackAddress()) {  
            // return inetAddress.getHostAddress().toString();  
            // }  
            // }  
            // }  
            WifiManager wifiManager = (WifiManager) context  
                    .getSystemService(Context.WIFI_SERVICE);  
            WifiInfo wifiInfo = wifiManager.getConnectionInfo();  
            int i = wifiInfo.getIpAddress();  
            return int2ip(i);  
        } catch (Exception ex) {  
            return " 获取IP出错鸟!!!!请保证是WIFI,或者请重新打开网络!\n" + ex.getMessage();  
        }  
        // return null;  
    }  
}  
11.viewpager里如何获取其子界面的按钮并为其添加监听器
   listViews.add(mInflater.inflate(R.layout.lay1, null));
   不要像上面合在一起写,分开写:
   View v1 = mInflater.inflate(R.layout.lay1, null);
   listViews.add(v1);
   然后通过v1.findViewById找到对应控件,就可以添加事件了
0 0
原创粉丝点击