[转]android学习----基础UI编程(一)

1 通过 DisplayMetrics 类获取屏幕宽高

示例代码

package zyp.Activity;

import android.app.Activity;
import android.os.Bundle;
import android.widget.*;
import android.util.*;

public class Test extends Activity {
    //Called when the activity is first created.

private TextView textView;

//在代码中定义一个 DispayMetrics 类对像

//DispayMetrics 一个描述普通显示信息的结构,例如显示大小 密度 字体尺寸

DisplayMetrics displayMetrics = new DisplayMetrics();

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

//getManager()获取显示定制窗口的管理器。
        //获取默认显示Display对象
        //通过Display 对象的数据来初始化一个DisplayMetrics 对象

getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        String text = "手机分辨率为:\n"+displayMetrics.widthPixels+"*"+displayMetrics.heightPixels;          
        textView = (TextView)findViewById(R.id.test_1);       
        setContentView(R.layout.main);      
        textView.setText(text);       
    }
}

关键点:

DisplayMetrics 类

Andorid.util 包下的DisplayMetrics 类提供了一种关于显示的通用信息,如显示大小,分辨率和字体。

为了获取DisplayMetrics 成员,首先初始化一个对象如下:

DisplayMetrics metrics = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(metrics);

注:构造函数DisplayMetrics 不需要传递任何参数;调用getWindowManager() 之后,会取得现有Activity 的Handle ,此时,getDefaultDisplay() 方法将取得的宽高维度存放于DisplayMetrics 对象中,而取得的宽高维度是以像素为单位(Pixel) ,“像素”所指的是“绝对像素”而非“相对像素”。

通过 DisplayMetrics的 toString()方法可以获取到 DisplayMetrics的大部分 fields信息,如下是在分辨率为480*320的情况下的一些输出信息:

其中,density为显示的逻辑分辨率(文档中说了很多,看的不是很明白);width及height就为屏幕的分辨率(为绝对宽度与高度),与fields中的widthPixels及heightPixels一致;scaleDensity与density一致;xdpi及ydpi为准确的物理像素。

WindowManager接口

  • 该接口用于与窗口管理器(Window Manager Service)交互。通过 Context.getSystemService(Context.WINDOW_SERVICE)可以获取到WindowManager的实例。
  • 这个接口可以添加view到屏幕,也可以从屏幕删除view。它面向的对象一端是屏幕,另一端就是View 。

WindowManager接口介绍 详见 :http://blog.sina.com.cn/s/blog_4b3c1f950100qd4d.html

2 标题、状态栏的隐藏

标题栏隐藏
在Activity.setCurrentView();之前调用此方法

private void HideTitle() {
   // TODO Auto-generated method stub
   requestWindowFeature(Window.FEATURE_NO_TITLE);
}

状态栏隐藏(全屏)
在Activity.setCurrentView();之前调用此方法
private void HideStatusBar() {
  // TODO Auto-generated method stub
  //隐藏标题
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  //定义全屏参数
  int flag=WindowManager.LayoutParams.FLAG_FULLSCREEN;
  //获得窗口对象
  Window myWindow=this.getWindow();
  //设置Flag标识
  myWindow.setFlags(flag,flag);

}

关键点

requestWindowFeature 方法

它的功能是启用窗体的扩展特性。

Window类

window类:概括了Android窗口的基本属性和基本功能。

window类 介绍:http://blog.sina.com.cn/s/blog_4b3c1f950100qd39.html

WindowManager.LayoutParams 类

WindowManager 接口主要用于与WindowManager(窗口管理服务)进行交互。

LayoutParams 是WindowManager 接口里面的一个嵌套类,包含了一系列的布局属性。

WindowManager 接口 介绍:http://blog.sina.com.cn/s/blog_4b3c1f950100qd4d.html

WindowManager(窗口管理服务)介绍:http://blog.sina.com.cn/s/blog_4b3c1f950100qe9m.html

3. Style 样式的定义

定义

在 /res/value/styles.xml  中定义以下样式:

<?xml version="1.0" encoding="utf-8"?>
    <resources>
        <style name="myStyle_Text1">
            <item name="android:textSize">25sp</item>
            <item name="android:textColor">#80FF00</item>
        </style>
        <style name="myStyle_Text2">
            <item name="android:textSize">18sp</item>
            <item name="android:textColor">#0C688E</item>
            <item name="android:fromAlpha">0.0</item>
            <item name="android:toAlpha" >0.0</item>
        </style>
    </resources>

使用

首先,在布局文件 main.xml 中添加两个 TextView 使用以上样式:

<TextView
        android:id="@+id/TextView01"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:gravity="center_vertical|center_horizontal"
        android:text="@string/string_A">  <!--string_A需要在strings.xml中定义 -->

</TextView>
    <TextView
        android:id="@+id/TextView02"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:gravity="center_vertical|center_horizontal"
        android:text="@string/string_B">  <!--string_B需要在strings.xml中定义 -->

</TextView>

然后,给新添加的TextView添加相应的样式:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

<TextView
            android:id="@+id/TextView01"

style="@style/myStyle_Text1"
            android:layout_height="wrap_content"
            android:layout_width="fill_parent"
            android:gravity="center_vertical|center_horizontal"
            android:text="@string/string_A">  <!--string_A需要在strings.xml中定义 -->

</TextView>

<TextView
            android:id="@+id/TextView02"

style="@style/myStyle_Text2"
            android:layout_height="wrap_content"
            android:layout_width="fill_parent"
            android:gravity="center_vertical|center_horizontal"
            android:text="@string/string_B">  <!--string_B需要在strings.xml中定义 -->

</TextView>
    </LinearLayout>

结果

运行,得到的界面如下:

关键点

1. style 样式的使用 参看:转 样式(style)的定义

3. Button 事件处理

示例代码

1.  在 mainActivity.java 中 findViewByID() 获取 Button 资源

press = (Button)findViewById(R.id.Click_Button);

2.  给Button 添加事件监听器Button.OnClickListener()

press.setOnClickListener(new Button.OnClickListener(){
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub

//按键事件处理代码...
    }
});

关键点

1. setOnClickListener

Button 类从其父类和接口中继承了非常多的方法,其中一个方法就是 setOnClickListener ,用于设置 button 的点击监听,它的函数原型如下:

public void setOnClickListener (View.OnClickListener l)

Register a callback to be invoked when this view is clicked. If this view is not clickable, it becomes clickable.

Parameters

    l: The callback that will run

2. View.OnClickListener

public static interface View.OnClickListener

类概括:Interface definition for a callback to be invoked when a view is clicked.

       View.OnClickListener 是 android.view 包下的一个接口类,其关键方法就是 onClick 这个抽象方法(也就是只有声明(定义)而没有实现)。

public abstract void onClick (View v)

Called when a view has been clicked.

Parameters

    v: The view that was clicked.

4. 同一Activity中的页面切换 ---- setContentView

示例代码

//前提:两个布局文件:main.xml mylayout.xml ,每个布局中都有一个 button ,点击 button 进行跳转。

package zyf.Ex8_UI;
import android.app.Activity; // import 相关class

import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class Ex8_UI extends Activity {
    // Called when the activity is first created.

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 载入main.xml Layout 
        setContentView(R.layout.main); // 默认启动布局
        // 以findViewById()取得Button 对象,并添加onClickListener
        Button b1 = (Button) findViewById(R.id.button1);
        b1.setOnClickListener ( new Button.OnClickListener() {
            public void onClick(View v) {
                jumpToLayout2(); // 调用跳转方法jumpToLayout2()
            }
        } ) ;
    }

// method jumpToLayout2:将layout 由main.xml 切换成mylayout.xml 
    public void jumpToLayout2() {
        // 将layout 改成mylayout.xml 
        setContentView(R.layout.mylayout);
        // 以findViewById()取得Button 对象,并添加onClickListener 
        Button b2 = (Button) findViewById(R.id.button2);
        b2.setOnClickListener ( new Button.OnClickListener() {
            public void onClick(View v) {
                jumpToLayout1(); // 调用跳转方法jumpToLayout1()
            }
        } );
    }

// method jumpToLayout1:将layout 由mylayout.xml 切换成main.xml
    public void jumpToLayout1() {
        // 将layout 改成main.xml 
        setContentView(R.layout.main);
       // 以findViewById()取得Button 对象,并添加onClickListener 
        Button b1 = (Button) findViewById(R.id.button1);
        b1.setOnClickListener ( new Button.OnClickListener() {
            public void onClick(View v) {
                jumpToLayout2(); // 调用跳转方法jumpToLayout2()
            }
        } ) ;
    }
}

结果

关键点

1. Activity.setContentView()

函数原型:

public void setContentView (int layoutResID)

Set the activity content from a layout resource. The resource will be inflated, adding all top-level views to the activity.

参数:

     layoutResID: Resource ID to be inflated.

其重载函数:

I. public void setContentView (View view)

Set the activity content to an explicit view. This view is placed directly into the activity‘s view hierarchy. It can itself be a complex view hierarhcy.

参数:

     view : The desired content to display.

代码样例:

  1. public class Main extends Activity {
  2. @Override
  3. public void onCreate(Bundle icicle) {
  4. super.onCreate(icicle);
  5. View v = View.inflate(this,R.layout.main,null);
  6. setContentView(v);
  7. }
  8. }

II.  public void setContentView (View view, ViewGroup.LayoutParams params)

Set the activity content to an explicit view. This view is placed directly into the activity‘s view hierarchy. It can itself be a complex view hierarhcy.

参数:

    view : The desired content to display.
    params: Layout parameters for the view

5.不同 Activity 间的切换 ---- Intent 对象的使用

代码示例

//两个布局文件:main.xml 和 mylayout.xml,每个布局中都有一个 TextView 和 button ,点击 button 进行跳转。

//AndroidManifest.xml 文件

//在 AndroidManifest.xml 文件中新添加 Activity ,名为SecondActivity

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
               package="zyf.Ex9_UI"
               android:versionCode="1"
               android:versionName="1.0">
               <application android:icon="@drawable/icon"
                                 android:label="@string/app_name" >
                     <activity android:name=".Ex9_UI"
                                  android:label="@string/app_name" >
                         <intent-filter>
                              <action android:name="android.intent.action.MAIN" />
                              <category android:name="android.intent.category.LAUNCHER" />
                         </intent-filter>
                     </activity>
                     <activity android:name="SecondActivity"></activity>
               </application>
               <uses-sdk android:minSdkVersion="2" />
</manifest>

Q:两个 android:name 后面跟着的属性值怎么一个有"." 一个没有呢 ??

A:

activity组件的android:name属性采用类名的简写方式,查看文档类名的简写格式为“.ClassName”,但为什么有的带".",有的不带呢?经过反复的测试,发现了一个规则: 
      如果manifest中指定了package属性,比如指定为"com.android.sample",如果activity的实现类也在这个package下,则android:name为实现的类名,这个类名前加不加点都没有关系,如果activity的实现类是在默认包的子包里面,则这个“.”是必须有的,比如activity的实现是com.android.sample.app.DialogActivity,则android:name必须写成.app.DialogActivity或者com.android.sample.app.DialogActivity。如果只写app.DialogActivity,则会报错。

//mainActivity.java 文件

//按键点击跳转到SecondActivity

package zyf.Ex9_UI;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class Ex9_UI extends Activity {
    // Called when the activity is first created. 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 载入main.xml Layout 
        setContentView(R.layout.main);
        // 以findViewById()取得Button 对象,并添加onClickListener 
        Button b1 = (Button) findViewById(R.id.button1);
        b1.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View v) {
                //new 一个Intent 对象,并指定要启动的class 
                Intent intent = new Intent();

intent.setClass(Ex9_UI.this, SecondActivity.class);
                // 调用一个新的Activity 
                startActivity(intent);
                // 关闭原本的Activity 
                Ex9_UI.this.finish();
            }
        });
    }
}

//SecondActivity.java 文件

//按键点击跳转到Activity :Ex9_UI

package zyf.Ex9_UI;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class SecondActivity extends Activity {

// Called when the activity is first created. 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 载入mylayout.xml Layout 
        setContentView(R.layout.mylayout);
        // 以findViewById()取得Button 对象,并添加onClickListener
        Button b2 = (Button) findViewById(R.id.button2);
        b2.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View v) {
                // new 一个Intent 对象,并指定要启动的class 
                Intent intent = new Intent();
                intent.setClass(SecondActivity.this, Ex9_UI.class);
                // 调用一个新的Activity 
                startActivity(intent);
                // 关闭原本的Activity 
                SecondActivity.this.finish();
            }
        });
    }
}

结果

关键点

1. Intent.SetClass

函数原型:

public Intent setClass (Context packageContext, Class<?> cls)

Convenience for calling setComponent(ComponentName) with the name returned by a Classobject.

参数:

packageContext :A Context of the application package implementing this class.

( Activity 继承自 Context )

cls :The class name to set, equivalent to setClassName(context, cls.getName()).

返回值:

Returns the same Intent object, for chaining multiple calls into a single statement.

2. Activity.StartActivity

函数原型:

public void startActivity (Intent intent)

Launch a new activity. You will not receive any information about when the activity exits.

This method throws ActivityNotFoundException if there was no Activity found to run the given Intent.

参数:

   intent : The intent to start

异常:

     android.content.ActivityNotFoundException

相关:

   startActivityForResult(Intent, int)

3. Activity.this.finish

函数原型:

public void finish ()

Call this when your activity is done and should be closed. The ActivityResult is propagated back to whoever launched you via onActivityResult().

Q:为什么在使用的时候不直接用 this.finish() ?? 不能 还是 习惯不好 ?

A:貌似 直接用 this.finish(), 是可以的,编译没有报错.....继续待验证

6. Activity 之间的数据传输

利用Intent传递数据

传递数据的Activity中:

Intent intent = new Intent();
    intent.putExtra("name","Jon"); //在Intent中加入键值对数据。键:name,值:Jon
    intent.setClass(Activity01.this,Activity02.class);
    Activity01.this.startActivity(intent);

在取出数据的Activity中:

Intent intent = getIntent(); //获得传过来的Intent。
    String value = intent.getStringExtra("name"); //根据键name取出值。

利用Bundle传递数据

Bundle :其实就是 map ,映射。

传递数据的Activity:

Intent intent = new Intent();
    Bundle myBundle = new Bundle();
    myBundle.putString("Key_Name","Tom");
    intent.putExtras(myBundle);
    intent.setClass(Activity01.this,Activity02.class);
    Activity01.this.startActivity(intent);

取出数据的Activity:

Bundle getBundle = getIntent().getExtras();
    String value = getBundle.getString("Key_Name");

利用startActivityForResult传递数据

startActivityForResult可以把数据传过去,还可以把那边的数据传过来。

传递数据的Activity中:

1. 传递数据

Intent intent      = new Intent();
    Bundle bundle  = new Bundle();
    bundle.putString("data", "somedata");//把数据传过去
    intent.putExtras(bundle);
    intent.setClass(Activity01.this, Activity02.class);
    startActivityForResult(intent, 10);//10是一个代码

2. 重载onActivityResult方法,用来接收传过来的数据:

protected void onActivityResult(int requestCode, int resultCode,Intent intent) {
   switch (resultCode) {
      case RESULT_OK:
          Bundle b = intent.getExtras();
          String str = b.getString("Result");
          setTitle("Return data:" + str);
          break;
      default:
          break;
    }
}

接收数据的Activity:

Intent   intent        = getIntent();
   Bundle getBundle = getIntent().getExtras();
   String   data          = getBundle.getString("data");//读取传过来的数据
   et.setText(data);

EditText edittext = (EditText) findViewById(R.id.text);
   Intent intent = new Intent();//实例化一个Intent用来传过去,可以在Intent里存放数据。
   Bundle bundle = new Bundle();
   bundle.putString("Result",edittext.getText().toString());
   intent.putExtras(bundle);
   Activity02.this.setResult(RESULT_OK,intent);//把Intent(数据)传过去,RESULT_OK是请求码。
   finish();//结束当前的Activity。

时间: 2024-10-19 10:50:20

[转]android学习----基础UI编程(一)的相关文章

[转]android学习----基础UI编程(四)

CheckBox 的使用 RadioButton 的使用 12. CheckBox 的使用 1)通过只含有一个CheckBox的实例来学习CheckBox的使用 示例代码 ① 创建新工程② 在string.xml 中添加字符串 <?xml version="1.0" encoding="utf-8"?><resources><string name="app_name">Ex_Ctrl_4</string

[转]android学习----基础UI编程(六)

相簿浏览 Gallery 文件搜索引擎FileSearch 17. Gallery 与 衍生BaseAdapter 容器 Gallery控件,即Android的图片库控件. 需要定义一个BaseAdaper的子类(eg.ImageAdapter)来操作控制图片资源,然后在主类中通过Gallery.setAdapter(new ImageAdapter(this));来使用这个控制类. 示例代码 本例中 ImageView 和 Gallery 控件相互协作 . ① 新建项目 ② 定义layout

[转]android学习----基础UI编程(七)

自动完成输入框 AutoCompleteTextView 多内容自动完成输入框 19. AutoCompleteTextView 自动完成输入框 智能输入框 AutoCompleteTextView 1. 简介 一个可编辑的文本视图显示自动完成建议当用户键入.建议列表显示在一个下拉菜单,用户可以从中选择一项,以完成输入.建议列表是从一个数据适配器获取的数据. 2. 重要方法 clearListSelection():清除选中的列表项 dismissDropDown():如果存在关闭下拉菜单 ge

[转]android学习----基础UI编程(八)

模拟/数字/线程小时钟设计 动态输入日期与时间 日期设置/时间设置对话框 21. 模拟/数字/线程小时钟设计 AnalogClock 与DigitalClock 的原理,以及线程时钟的实现 . 示例代码 ① 新建工程② 修改man.xml 布局,添加一个AnalogClock.一个DigitalClock.一个TextView<TextView  //这个TextView 用来显示线程时钟    android:id="@+id/TextView_showTime"    and

[转]android学习----基础UI编程(五)

相框设计 :ImageView 的堆叠作用 相框设计 :ImageButton 的堆叠作用 自定义下拉菜单 :Spinner 与setDropDownViewResource 动态添加╱删除的Spinner 菜单 : ArrayList 与Widget 的依赖性 14. 专业相框设计 1)ImageView 的堆叠应用 利用 ImageView 的堆叠,将上例中的实现不同相框的更换 示例代码 ① 新建工程② 准备三张png 图片 ③ 修改main.xml 布局,添加UI 元素 <?xml ver

[转]android学习----基础UI编程(三)

9. Toast--Android 专属浮动小提示 下例中,实现在一个EditView中输入一段话后,点击Button,Toast显示这段话. 示例代码: ① 新建工程② 在string.xml 中添加字符串 <?xml version="1.0" encoding="utf-8"?>    <resources>        <string name="app_name">EX_Ctrl_3</str

[转]android学习----基础UI编程(二)

7. TextView 和 EditView 共舞 预达到效果:在EditText中输入同时TextView进行输出 //前提:在main.xml中添加EditText 和 TextView控件 核心代码示例: public class EX_Ctrl_1 extends Activity {    private TextView mTextView01;    private EditText mEditText01;    // Called when the activity is fi

[转]android学习----消息机制

一. 角色描述 1. Looper : 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列). 2. Handler : 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里:或者接收Looper(从Message Queue取出)所送来的消息. 3. Message Queue(消息队列) : 用来存放线程放入的消息. 4. 线程 :UI thread通常就是main thread,而Android启动程

[转]android学习总结----Activity view

什么是Activity? Activity 是用户接口程序,原则上它会提供给用户一个交互式的接口功能. 它是 android 应用程序的基本功能单元. Activity 本身是没有界面的 什么是view/ viewGroups? view/ viewGroups :表示在 android 平台上的基本用户界面单元. view :为指定的屏幕矩形区域存储布局和内容.处理尺寸和布局,绘制,焦点改变,翻屏,按键 等… viewGroups:包含并管理下级系列的views 和 下级的 viewGroup