码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2015-06-11 18:50:42      阅读:305      评论:0      收藏:0      [点我收藏+]

标签:

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.thisSecondActivity.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。
 

 

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

标签:

原文地址:http://www.cnblogs.com/wj033/p/4569685.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!