Android SDK更新以及ADT更新出现问题的解决办法

使用SDK Manager更新时出现问题Failed to fetch URL https://dl-ssl.google.com/android/repository/repository-6.xml, reason: Connection to https://dl-ssl.google.com refusedFailed to fetch URL http://dl-ssl.google.com/android/repository/addons_list-1.xml, reason: Connection to http://dl-ssl.google.com refusedFailed to fetch URL https://dl-ssl.google.com/android/repository/addons_list-1.xml, reason: hostname in certificate didn't match: <dl-ssl.google.com> != <www.google.com>更新ADT时无法解析https://dl-ssl.google.com/android/eclipse

Android SDK更新以及ADT更新出现问题的解决办法3

方法/步骤

  1. 大家肯定很急,我就不废话了,直接上解决办法了!

    打开SDK Manager下Tools->Options,选中“Force https://… sources to be fetched using http://…”,强制使用http协议。

    Android SDK更新以及ADT更新出现问题的解决办法45
  2. 上一步选取之后,有的用户可以更新出列表来。如果还是不能,继续下面的操作。

    在地址栏里输入:C:\WINDOWS\system32\drivers\etc

    Android SDK更新以及ADT更新出现问题的解决办法6
  3. 我们会看到hosts文件,右击打开方式选择记事本。在里面把下面文字复制进去,内容如下(特别强调:是在原本的内容后面粘贴下面的内容,而不是覆盖):

    #Google主页

    203.208.46.146 www.google.com

    #这行是为了方便打开Android开发官网 现在好像不VPN也可以打开

    74.125.113.121 developer.android.com

    #更新的内容从以下地址下载

    203.208.46.146 dl.google.com

    203.208.46.146 dl-ssl.google.com

    Android SDK更新以及ADT更新出现问题的解决办法7
  4. 有的用户接着就会看到加载出列表了。如果没有变化,重新打开SDK Manager。就会发现问题解决了。如图1

    如果还是无法加载出列表,还是出现如图2红色内容,建议过几天再试试!

    Android SDK更新以及ADT更新出现问题的解决办法8
    Android SDK更新以及ADT更新出现问题的解决办法9
  5. 5

    更新ADT插件的时候则使用网址http://dl-ssl.google.com/android/eclipse,而不是https://dl-ssl.google.com/android/eclipse,这个在官方开发文档里也有介绍。

 

使用Android ADT最新开发工具后,新建项目出现appcompat v7 他是什么?

做Android开发的朋友最近会发现,更新ADT至22.6.0版本之后,创建新的安装项目,会出现appcompat_v7的内容。并且是创建一个新的内容就会出现。这到底是怎么回事呢?原来appcompat_v7是Google自己的一个兼容包,就是一个支持库,能让2.1以上全使用上4.0版本的界面。下面就让笔者带你慢慢走近这个问题并解决它。

你会发现项目创建好后,workspace栏里除了我们创建的“test”项目,还多了一个名为“appcompat_v7”的包,而且这个包显示有错误(红色x号),而“test”包显示一个红色的感叹号。

解决办法:如果你依旧对appcompat_v7包耿耿于怀,我告诉你一个建项目时不出现appcompat_v7包的方法。既然appcompat_v7包是一个能让2.1以上全使用上4.0版本的界面的支持库,那么如图所示,我们建项目时直接把最小SDK选在Android4.0以上不就不需要这个支持库了吗?结果证明我们的想法是对的。

 

Android LayoutInflater详解

在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById()。不同点是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);
其实,这三种方式本质是相同的,从源码中可以看出:
getLayoutInflater():
Activity 的 getLayoutInflater() 方法是调用 PhoneWindow 的getLayoutInflater()方法,看一下该源代码:
public PhoneWindow(Context context)
{
 super(context);
    mLayoutInflater = LayoutInflater.from(context);
}
可以看出它其实是调用 LayoutInflater.from(context)。
LayoutInflater.from(context):
public static LayoutInflater from(Context context)
{
 LayoutInflater LayoutInflater = (LayoutInflater) context.getSystemService
         (Context.LAYOUT_INFLATER_SERVICE);
    if (LayoutInflater == null)
    {
     throw new AssertionError("LayoutInflater not found.");
    }
    return LayoutInflater;
}
可以看出它其实调用 context.getSystemService()。
结论:所以这三种方式最终本质是都是调用的Context.getSystemService()。
另外getSystemService()是Android很重要的一个API,它是Activity的一个方法,根据传入的NAME来取得对应的Object,然后转换成相应的服务对象。以下介绍系统相应的服务。
传入的Name 返回的对象 说明
WINDOW_SERVICE WindowManager 管理打开的窗口程序
LAYOUT_INFLATER_SERVICE LayoutInflater 取得xml里定义的view
ACTIVITY_SERVICE ActivityManager 管理应用程序的系统状态
POWER_SERVICE PowerManger 电源的服务
ALARM_SERVICE AlarmManager 闹钟的服务
NOTIFICATION_SERVICE NotificationManager 状态栏的服务
KEYGUARD_SERVICE KeyguardManager 键盘锁的服务
LOCATION_SERVICE LocationManager 位置的服务,如GPS
SEARCH_SERVICE SearchManager 搜索的服务
VEBRATOR_SERVICE Vebrator 手机震动的服务
CONNECTIVITY_SERVICE Connectivity 网络连接的服务
WIFI_SERVICE WifiManager Wi-Fi服务
TELEPHONY_SERVICE TeleponyManager 电话服务
inflate 方法
通过 sdk 的 api 文档,可以知道该方法有以下几种过载形式,返回值均是 View 对象,如下:
public View inflate (int resource, ViewGroup root)
public View inflate (XmlPullParser parser, ViewGroup root)
public View inflate (XmlPullParser parser, ViewGroup root, boolean attachToRoot)
public View inflate (int resource, ViewGroup root, boolean attachToRoot)
示意代码:
LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.custom, (ViewGroup)findViewById(R.id.test));
//EditText editText = (EditText)findViewById(R.id.content);// error
EditText editText = (EditText)view.findViewById(R.id.content);
对于上面代码,指定了第二个参数 ViewGroup root,当然你也可以设置为 null 值。
注意:
·inflate 方法与 findViewById 方法不同;
·inflater 是用来找 res/layout 下的 xml 布局文件,并且实例化;
·findViewById() 是找具体 xml 布局文件中的具体 widget 控件(如:Button、TextView 等)。

Android 中 getApplicationContext()、this、getApplication()之间的区别

1. getApplicationContext():生命周期是整个应用,应用摧毁,它才摧毁。
2. this:代表当前,在Activity当中就是代表当前的Activity,换句话说就是Activity.this在Activity当中可以缩写为this.
3. getApplication():andorid 开发中共享全局数据;

我们在平时的开发中,有时候可能会需要一些全局数据,来让应用中得所有Activity和View都能访问到,大家在遇到这种情况时,可能首先会想到自己定义一个类,然后创建很多静态成员,不过andorid已经为我们提供了这种情况的解决方案:在Android中,有一个名为Application的类,我们可以在Activity中使用getApplication(),方法来获得,它是代表我们的应用程序的类,使用它可以获得当前应用的主题,资源文件中的内容等,这个类更灵活的一个特性就是可以被我们继承,来添加我们自己的全局属性。

自建TabHost,为什么R.java中无tabhost的id

问题出在你的xml布局定义中的这一行:
android:id="@android:id/tabhost"

如果是想不用android的tabhost的id,那么这行应该改为:

android:id="@+id/tabhost"

如果确实要用android的定义,又要找到这个窗口,那么应该改代码中的这行:

TabHost mTabHost = (TabHost)findViewById(R.id.tabhost);

应该改成

TabHost mTabHost = (TabHost)findViewById(android.R.id.tabhost);

No orientation specified, and the default is horizontal.

整的错误提示信息为:No orientation specified, and the default is horizontal. This is a common source of bugs when
children are added dynamically.
通常发生这个错误提示的原因是我们直接在原有的页面上把别的布局标签改成<LinearLayout>,但是使用<LinearLayout>标签要指明方向,水平方向还是垂直方向
horizontal or vertical
所以直接修改,会导致没有指名线性布局的方向,只要添加上
android:orientation = "vertical"

android:orientation = "horizontal"
即可解决