1. Application类
这部分主要来自
Android中Application类用法。
Application和Activity、Service一样是Android框架的一个系统组件,当Android程序启动时Android系统自动会为每个程序运行时创建一个Application类的对象且只创建一个,用来存储系统的一些信息。
Application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局的单例的,所以在不同的Activity、Service中获得的对象都是同一个对象。所以可以通过Application来进行一些,如:数据传递、数据共享和数据缓存等操作。
通常我们不需要指定一个Application的,系统会自动帮我们创建,当然也可以创建自己的Application,具体做法下面会说。启动Application时,系统会创建一个PID,即进程ID,所有的Activity都会在此进程上运行。如果在Application创建的时候初始化全局变量,同一个应用的所有Activity都可以取到这些全局变量的值,换句话说,在某一个Activity中改变了这些全局变量的值,那么在同一个应用的其他Activity中值就会改变。
应用场景
在Android中,可以通过继承Application类来实现应用程序级的全局变量,这种全局变量方法相对静态类更有保障,直到应用的所有Activity全部被destory掉之后才会被释放掉。
实现步骤
比如,博主想在Application类中获取手机屏幕的尺寸,应用中任何一个Activity都可以通过Application类获得它。这个在博主之前文章
【Android】开发小经验1中第10点提到过,这里以这个为例详细说一下。
1. 继承Application类
主要就是重写onCreate()方法(android.app.Application包的onCreate()才是Android程序真正的入口),初始化变量的值。然后在整个应用中的各个文件中就可以对该变量进行操作了。博主的例子就是在onCreate()方法里获取屏幕尺寸。
import android.app.Application;
import android.content.Context;
import android.content.ContextWrapper;
import android.util.Log;
import android.view.Display;
import android.view.WindowManager;
import android.widget.TextView;
public class MyApp extends Application
{
private int width,height;//屏幕尺寸,单位为像素px
@Override
public void onCreate()
{
super.onCreate();
//获取屏幕尺寸(横屏时)
ContextWrapper ctx=new ContextWrapper(this);
WindowManager wm = (WindowManager)ctx.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
if(display.getWidth()
<application
android:name="com.edu.activity.MyApp">
</application>
3. 在任一Activity中获取Application中的变量
只需在任一Activity的onCreate()中执行以下代码,获得Application类,它是代表应用程序的类,使用它可以获得当前应用的主题和资源文件中的内容等,这个类更灵活的一个特性就是可以被继承,来添加我们自己的全局属性。
//获得Application类的实例,以获取全局变量
MyApp app=(MyApp)getApplication();
int width=app.getWidth();
int height=app.getHeight();
2. 在Activity间用Intent传递参数
比如,Activity1要将作者名(是一个字符串)传给Activity2,就在Activity1中如下写。putExtra()方法的第一个参数是key,第二个参数是value,value除了字符串还有很多类型,具体用到的时候自己再查阅。Intent intent=new Intent();
intent.putExtra("name",author);
intent.setClass(Activity1.this,Activity2.class);
startActivity(intent);
Activity2中要读取Activity1传给它的作者名,读Intent传来的数据是get****Extra()方法,****是什么依传来的数据类型而定。因为作者名是一个字符串,所以用getStringExtra()方法,其他的方法用到时再查阅。
Intent intent=getIntent();
String author=intent.getStringExtra("name");
3. Toast的使用方法
这部分主要来自
android toast几种使用方法。
默认展示
Toast toast=Toast.makeText(getApplicationContext(), "默认的Toast", Toast.LENGTH_SHORT);
toast.show();//显示Toast信息
或者
Toast.makeText(getApplicationContext(), "默认的Toast", Toast.LENGTH_SHORT).show();
第二个参数——要显示的字符串,也可是R.string中字符串ID 。
第三个参数——显示的时间长短,Toast默认的有两个LENGTH_LONG和LENGTH_SHORT,也可以使用毫秒如2000(ms)
自定义显示位置
toast.setGravity(Gravity.TOP|Gravity.CENTER, -50, 100);
第一个参数——设置toast在屏幕中显示的位置,这里设置的是居中靠顶。
第二个参数——相对于第一个参数设置toast位置的横向X轴的偏移量,正数向右偏移,负数向左偏移。
第三个参数——纵向y轴的偏移量,同第二个参数道理一样 。 如果你设置的偏移量超过了屏幕的范围,toast将在屏幕内靠近超出的那个边界显示。
带图片的
//创建图片视图对象
ImageView imageView= new ImageView(getApplicationContext());
//设置图片
imageView.setImageResource(R.drawable.ic_launcher);
//获得toast的布局
LinearLayout toastView = (LinearLayout) toast.getView();
//设置此布局为横向的
toastView.setOrientation(LinearLayout.HORIZONTAL);
//将ImageView在加入到此布局中的第一个位置
toastView.addView(imageView, 0);
toast.show();
完全自定义显示方式
先写好Toast的xml布局toast.xml,例如:
<ImageView
<span style="white-space:pre"> </span>android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
<span style="white-space:pre"> </span><TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<span style="white-space:pre"> </span><TextView
android:id="@+id/content"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
代码里
public class ToastActivity extends Activity
{
private Button bt;
private ImageView image;
private TextView title, content;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bt = (Button) findViewById(R.id.bt);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showToast();
}
});
}
private void showToast()
{
//获取Toast的布局
LayoutInflater inflater = getLayoutInflater();
View view = inflater.inflate(R.layout.toast, null);
//对布局里的组件进行设置
image = (ImageView) view.findViewById(R.id.image);
title = (TextView) view.findViewById(R.id.title);
content = (TextView) view.findViewById(R.id.content);
image.setBackgroundResource(R.drawable.ic_launcher);
title.setText("自定义toast");
content.setText("hello,self toast");
//显示Toast
Toast toast = new Toast(getApplicationContext());
toast.setGravity(Gravity.CENTER, 0, 0);
toast.setDuration(Toast.LENGTH_SHORT);
toast.setView(view);
toast.show();
}
}
4. android:visibility属性
有3种状态,设置每种状态的XML和Java代码写法如下:
- 可见(visible)——android:visibility="visible" 和 view.setVisibility(View.VISIBLE);
- 不可见(invisible)——android:visibility="invisible"和view.setVisibility(View.INVISIBLE);
- 隐藏(GONE)——ndroid:visibility="gone"和view.setVisibility(View.GONE);
5. 字体加粗
在xml文件中使用可以将英文设置成粗体,但是
这种方法不能将中文设置成粗体。
android:textStyle="bold"
将中文设置成粗体,只能通过java代码
TextView tv = (TextView)findViewById(R.id.textView1);
TextPaint tp = tv.getPaint();
tp.setFakeBoldText(true);
6. 设置Tabhost尺寸和字体大小
网上与很多关于如何自定义Tabhost的文章,比如:用图片代替文字、修改背景等等,但是当Tabhost不需要贴图,只想修改一下长宽或者设置字体大小时,可以用下面简单的代码实现,参考
http://www.tuicool.com/articles/Q3aUNj。
TabWidget tabWidget= tabHost.getTabWidget();
for (int i =0; i < tabWidget.getChildCount(); i++)
{
//修改Tabhost尺寸
tabWidget.getChildAt(i).getLayoutParams().height = 30;
tabWidget.getChildAt(i).getLayoutParams().width = 65;
//修改字体大小
TextView tv =(TextView)tabWidget.getChildAt(i).findViewById(android.R.id.title);
tv.setTextSize(18);
}
博主实验后发现:
修改Tabhost长度的代码是无效的,修改Tabhoust高度的代码有效。仔细想想,修改Tabhost的长度没有什么意义,如果有别的说法还请告诉博主。
7. 横竖屏切换不重启Activity
给每个Activity加上以下属性,就不会重启Activity。
android:configChanges="keyboardHidden|orientation"
如果横竖屏的界面有2个不同的布局,可以再Activity里重写以下函数。
if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE)
//横向
setContentView(R.layout.file_list_landscape);
else
//竖向
setContentView(R.layout.file_list);