第一天1
这一天主要的目的是splash界面的实现
关键词:判断用户的手机是否联网,加载主界面。
首先是xml文件的定义:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/home_gradient"
android:gravity="center"
android:orientation="vertical" >
<ImageView
android:id="@+id/logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="20dip"
android:paddingRight="20dip"
android:scaleType="centerInside"
android:src="@drawable/logo" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dip"
android:gravity="bottom"
android:shadowColor="#FFFFFF"
android:shadowDx="1"
android:shadowDy="2"
android:text="我的豆瓣"
android:textColor="#444444"
android:textSize="35dip"
android:typeface="normal" />
<!-- android:typeface 设置文本字体,必须是以下常量值之一:normal 0, sans 1, serif 2, monospace(等宽字体) 3] -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dip"
android:gravity="bottom"
android:shadowColor="#FFFFFF"
android:shadowDx="0"
android:shadowDy="2"
android:shadowRadius="1"
android:text="豆瓣客户端"
android:textColor="#444444"
android:textSize="25dip"
android:typeface="serif" >
</TextView>
<TextView
android:id="@+id/versionNumber"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dip"
android:gravity="bottom"
android:shadowColor="#FFFFFF"
android:shadowDx="0"
android:shadowDy="2"
android:shadowRadius="1"
android:text="版本号"
android:textColor="#444444"
android:textSize="20dip"
android:typeface="serif" >
</TextView>
</LinearLayout>
关于这个xml文件的定义:主要需要辨别padding ,margin等对齐方式的区别。初次之外就是对于文本内容出现阴影的情况的设置。
<!-- android:typeface 设置文本字体,必须是以下常量值之一:normal 0, sans 1, serif 2, monospace(等宽字体) 3] -->
ImageView.ScaleType CENTER 图片位于视图中间,但不执行缩放比例
Splash界面的实现逻辑
package com.luochuang.douban;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.widget.TextView;
public class SplashActivity extends Activity {
private TextView versionNumber;
private PackageManager pm;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.splash);
versionNumber = (TextView) findViewById(R.id.versionNumber);
versionNumber.setText("版本号:" + getversion());
}
// 在当前的界面变为用户可见的时候调用的方法(熟练使用activity的生命周期)
@Override
protected void onStart() {
if (isconnect()) {
new Thread() {
public void run() {
try {
Thread.sleep(2000);
} catch (Exception e) {
e.printStackTrace();
}
loadMainUi();
};
}.start();
} else {
showDialog();
}
super.onStart();
}
// 设置版本号
public String getversion() {
try {
pm = getPackageManager();//利用packmanager管理服务获取ersion的name
PackageInfo info = pm.getPackageInfo(getPackageName(), 0);
String versionname = info.versionName;
return versionname;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
// 检查是否联网
public boolean isconnect() {
boolean result = false;
ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
if (info != null) {
result = info.isConnected();
}
return result;
}
// 如果没有联网,弹出对话框提示用户设置网络
public void showDialog() {
AlertDialog.Builder dialog = new Builder(this);
dialog.setTitle("设置网络");
dialog.setMessage("当前网络不可用,请设置");
dialog.setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 进入到设置网络的界面(setting)
Intent intent = new Intent();
intent.setClassName("com.android.settings",
"com.android.settings.WirelessSettings");
startActivity(intent);
}
});
dialog.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
dialog.create().show();
}
// 联网的话就进入主界面
public void loadMainUi() {
Intent intent = new Intent();
intent.setClass(this, MainActivity.class);
startActivity(intent);
//关闭掉当前的activity(当前的splash一定要从任务栈内移除)
finish();
}
}
问题的出现和解决的办法:
1.每次在检查完联网功能的实现的时候,就跳转到默认的界面,解决办法,把LoadMianUI的方法的子线程在onstart方法中调用。
理由:如果从activity的角度出发就很好的理解问题了,onstart方法是每次当一个activity出现在用户展示的时候被调用的。此时如果用户联网成功就会执行loadmainui方法。直接跳转到mainAcitivity。
2.每次当按下返回键推出的时候,之前的splash界面就会重现展示出来,主要的原因是在跳转的时候,并没有制定当前的activity的finish().所以当用户在按下返回键的时候会出现以上的情况。
3.关于不同应用之间activity的跳转,可以使用setclassname的方式,只是需要注意,这种方式跳转的两个参数一个是这个activity的包名后面是这个activity的包名加上全名。
Intent intent = new Intent();
intent.setClassName("com.android.settings",
"com.android.settings.WirelessSettings");
startActivity(intent);