導航:首頁 > 操作系統 > androidxmlnstools

androidxmlnstools

發布時間:2022-08-19 00:54:16

A. 安卓xml布局。重合在一起。

相對布局本來就是這樣,你沒有指明它們之間的相對位置,它們只能按照原始位置擺放,
RelativeLayout改成LinerLayout就不會了

B. android系統如何調用自帶的相機相冊

LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="gallery"
android:text="獲取圖庫圖片" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="camera"
android:text="拍照獲取圖片" />

<ImageView
android:id="@+id/iv_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>

//------------------我的MainActivity --------------也很簡單--------------------------

package tackpicture.bwie.com.tackpicture;

import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;

import java.io.File;

public class MainActivity extends AppCompatActivity {

private ImageView iv_image;

private static final int PHOTO_REQUEST_CAREMA = 1;// 拍照
private static final int PHOTO_REQUEST_GALLERY = 2;// 從相冊中選擇
private static final int PHOTO_REQUEST_CUT = 3;// 結果
/* 頭像名稱 */
private static final String PHOTO_FILE_NAME = "temp_photo.jpg";
private File tempFile;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找到控制項
iv_image = (ImageView) findViewById(R.id.iv_image);
}

//圖庫
public void camera(View view) {
// 激活系統圖庫,選擇一張圖片
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
// 開啟一個帶有返回值的Activity,請求碼為PHOTO_REQUEST_GALLERY
startActivityForResult(intent, PHOTO_REQUEST_GALLERY);
}

//相機
public void gallery(View view) {
// 激活相機
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
// 判斷存儲卡是否可以用,可用進行存儲
if (hasSdcard()) {
tempFile = new File(Environment.getExternalStorageDirectory(), PHOTO_FILE_NAME);
// 從文件中創建uri
Uri uri = Uri.fromFile(tempFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
}
// 開啟一個帶有返回值的Activity,請求碼為PHOTO_REQUEST_CAREMA
startActivityForResult(intent, PHOTO_REQUEST_CAREMA);
}

/*
* 剪切圖片
*/
private void crop(Uri uri) {
// 裁剪圖片意圖
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
// 裁剪框的比例,1:1
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// 裁剪後輸出圖片的尺寸大小
intent.putExtra("outputX", 250);
intent.putExtra("outputY", 250);

intent.putExtra("outputFormat", "JPEG");// 圖片格式
intent.putExtra("noFaceDetection", true);// 取消人臉識別
intent.putExtra("return-data", true);
// 開啟一個帶有返回值的Activity,請求碼為PHOTO_REQUEST_CUT
startActivityForResult(intent, PHOTO_REQUEST_CUT);
}

/*
* 判斷sdcard是否被掛載
*/
private boolean hasSdcard() {
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
return true;
} else {
return false;
}
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == PHOTO_REQUEST_GALLERY) {
// 從相冊返回的數據
if (data != null) {
// 得到圖片的全路徑
Uri uri = data.getData();
crop(uri);
}
} else if (requestCode == PHOTO_REQUEST_CAREMA) {
// 從相機返回的數據
if (hasSdcard()) {
crop(Uri.fromFile(tempFile));
} else {
Toast.makeText(MainActivity.this, "未找到存儲卡,無法存儲照片!", 0).show();
}

} else if (requestCode == PHOTO_REQUEST_CUT) {
// 從剪切圖片返回的數據
if (data != null) {
Bitmap bitmap = data.getParcelableExtra("data");
this.iv_image.setImageBitmap(bitmap);
}
try {
// 將臨時文件刪除
tempFile.delete();
} catch (Exception e) {
e.printStackTrace();
}

}

super.onActivityResult(requestCode, resultCode, data);
}

}

C. android自定義shape 時xmlns怎麼自動

MainActivity如下:
package cn.testshape;
import android.os.Bundle;
import android.app.Activity;
/**
* Demo描述:
* 自定義shape的使用
*/
public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}

}

main.xml如下:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>

<Button
android:layout_width="250dip"
android:layout_height="50dip"
android:text="測試自定義shape的使用"
android:background="@drawable/background_selector"
android:textColor="@drawable/textcolor_selector"
android:layout_centerInParent="true"
android:gravity="center"
/>

</RelativeLayout>

background_selector.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:drawable="@drawable/pressed_shape" android:state_pressed="true"/>
<item android:drawable="@drawable/default_shape"/>
</selector>

default_shape.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<!-- 定義矩形rectangle -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<!-- 定義邊框顏色 -->
<solid android:color="#d1d1d1" />
<!-- 定義圓角弧度 -->
<corners
android:bottomLeftRadius="4dp"
android:bottomRightRadius="4dp"
android:topLeftRadius="4dp"
android:topRightRadius="4dp"
/>

</shape>

pressed_shape.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<!-- 定義矩形rectangle -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<!-- 定義邊框顏色 -->
<solid android:color="#7bb3f8" />
<!-- 定義圓角弧度 -->
<corners
android:bottomLeftRadius="4dp"
android:bottomRightRadius="4dp"
android:topLeftRadius="4dp"
android:topRightRadius="4dp"
/>

</shape>

textcolor_selector.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:color="#ffffff" android:state_pressed="true"/>
<item android:color="#000000"/>
</selector>

D. 如何理解Android中的xmlns

首先,我們先來看下到底什麼是xmlns,它是 XML 文檔中的一個概念:英文叫做 XML namespace,中文翻譯為 XML 命名空間。一講到命名空間,我想很多人會聯想到C++中的namespace和Java中的 packagename,而這兩者的作用都是為了解決命名上的沖突(例如類名,介面名等)。類似的,XML namespace也是為了解決 XML 中元素和屬性命名沖突,因為 XML 中的標簽並不是預定義的,這一點與 HTML 是有區別的,HTML 中的標簽是預定義的,所以我們會遇到命名沖突的問題。

XML 命名空間定義語法為xmlns:namespace-prefix="namespaceURI",一共分為三個部分:

xmlns:聲明命名空間的保留字,其實就是XML中元素的一個屬性;

namespace-prefix:命名空間的前綴,這個前綴與某個命名空間相關聯;

namespaceURI:命名空間的唯一標識符,一般就是一個URI引用。

通過上面的內容的講解,我們對命名空間有了一定的了解,下面我們通過一個例子引用來說明一下xmlns屬性是如何解決命名沖突的:

命名沖突
在 XML 中,元素名稱是由開發者定義的,當兩個不同的文檔使用相同的元素名時,就會發生命名沖突。這個 XML 文檔攜帶著某個表格中的信息:

<table>
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>

這個 XML 文檔攜帶有關桌子的信息:

<table>
<name>African Coffee Table</name>
<width>80</width>
<length>120</length>
</table>

假如這兩個 XML 文檔被一起使用,由於兩個文檔都包含帶有不同內容和定義的 <table> 元素,就會發生命名沖突。XML 解析器無法確定如何處理這類沖突。

使用命名空間(Namespace)
這個XML文檔攜帶著某個表格中的信息:

<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>

此XML文檔攜帶著有關一件傢具的信息:

<f:table xmlns:f="http://www.w3school.com.cn/furniture">
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>

我們為<table>標簽添加了一個xmlns屬性,並在每個標簽前面都添加了相應的前綴,這個前綴是一個與某個命名空間相關聯的限定名稱,這個前綴就代表後面那個 URI 引用,或者說一個縮寫。

關於xmlns就先簡單講到這里,大家如果要深入了解的話,可以點擊本文中的跳轉鏈接,下一節我們來看下 Android 中的那些xmlns。

Android中的xmlns

在Android中,目前我們碰到的xmlns一共有三種:

xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"

android

命名空間android用於 Android 系統定義的一些屬性。

app

命名空間app用於我們應用自定義的一些屬性,這個與 Android 自定義屬性和系統控制項擴展應該有關系,大家可以再繼續研究一下。

tools

根據官方定義,tools命名空間用於在 XML 文檔記錄一些,當應用打包的時候,會把這部分信息給過濾掉,不會增加應用的 size,說直白點,這些屬性是為IDE提供相關信息

E. android怎麼根據路徑打開文件夾

Android根據路徑打開文件夾的步驟:
1、android系統內置了很多應用,包括電話撥號,簡訊,瀏覽器等,這里創建一個簡單的Android程序,調用內置的瀏覽器打開指定的地址。
2、對應的layout xml為:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/btnGo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_marginTop="46dp"
android:text="@string/btnTitle_go" />
<EditText
android:id="@+id/txtUri"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/btnGo"
android:layout_alignBottom="@+id/btnGo"
android:layout_alignParentLeft="true"
android:layout_toLeftOf="@+id/btnGo"
android:ems="10"
android:text="http://junqilian.cnblogs.com" >
<requestFocus />
</EditText>
</RelativeLayout>
3、Java代碼實現如下,主要是給EditText添加一個OnKeyListener,處理在editText裡面按回車鍵,給button添加一個onClickListener,觸發到OpenBroswer函數,通過intent打開內置的瀏覽器。

F. Android中如何在布局文件中為組件綁定點擊事件

在Android中為組件綁定點擊事件的方式可以分為四種,
1、 在xml布局文件中,定義onclick的方式
<!—第一步在XML文件中給對應組件添加Onclick屬性-->
<Button
android:id="@+id/submitbutton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:onClick="buttonClickHandle"
android:layout_alignParentTop="true"
android:text="提交" />
//第二步在對應的Activity中創建一個與onClick屬性值相同的方法,並傳入一個View參數,當Button被點擊時就會回調這個方法。
public void buttonClickHandle(View view) {
Snackbar.make(coordinatorLayout, "你點擊了Button", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
另外三種綁定點擊事件的方式實際上就是通過組件調用setOnClickListener()的方法,下面我們就來看一下這個方法的源碼
/**
* Register a callback to be invoked when this view is clicked. If this view is not
* clickable, it becomes clickable.
*
* @param l The callback that will run
*
* @see #setClickable(boolean)
*/
public void setOnClickListener(@Nullable OnClickListener l) {
if (!isClickable()) {
setClickable(true);
}
getListenerInfo().mOnClickListener = l;
}

根據源碼我們可以看到這個方法中需要一個OnClickListener的對象。下面我們就來看看這個OnClickListener對象是個什麼東東。
/**
* Interface definition for a callback to be invoked when a view is clicked.
*/
public interface OnClickListener {
/**
* Called when a view has been clicked.
*
* @param v The view that was clicked.
*/
void onClick(View v);
}
根據源碼我們可以看到實際上這個OnClickListener就是一個介面,這個介面中有一個onClick的抽象方法。所以我們在創建這個OnClickListener對象是還需要實現這個抽象方法。這個onClick的抽象方法實際上就是當我們點擊按鈕後會回調的方法。我們對於點擊事件的響應處理就在這個方法中進行。
現在我們已經了解了設置點擊事件的setOnClickListener方法,根據我們如何創建這個方法中的OnClickListener對象,我們設置點擊事件的方式可以分為如下三種:
1、內部類的形式
a. package com.example.hsport.catalog;

import android.os.Bundle;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

private CoordinatorLayout coordinatorLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
coordinatorLayout = (CoordinatorLayout) findViewById(R.id.coordinator);
// 獲取button對象
Button button = (Button) findViewById(R.id.submitbutton);
//創建內部類的實例
MyListener myListener = new MyListener();
//設置button的點擊事件,將實現OnClickListener介面的內部類實例傳入到setOnClickListener方法中
button.setOnClickListener(myListener);
}

//創建一個內部類實現View.OnClickListener介面,並實現其onClick方法
private class MyListener implements View.OnClickListener {
@Override
public void onClick(View v) {
Snackbar.make(coordinatorLayout, "你點擊了Button", Snackbar.LENGTH_LONG).setAction("Action", null).show();
}
}
}

2、 匿名內部類的方式
package com.example.hsport.catalog;

import android.os.Bundle;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

private CoordinatorLayout coordinatorLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
coordinatorLayout = (CoordinatorLayout) findViewById(R.id.coordinator);
//獲取Button對象
Button button = (Button) findViewById(R.id.submitbutton);
//以創建一個View.OnClickListener的匿名內部類,並實現它的onClick方法
button.setOnClickListener(new View.OnClickListener() {
//在onClick方法中我們就可以設置button的響應代碼了
@Override
public void onClick(View v) {
Snackbar.make(coordinatorLayout, "你點擊了Button",Snackbar.LENGTH_LONG).setAction("Action", null).show();
}
});
}

3、 讓主類實現OnClickListener介面,然後再主類實現未實現的方法

package com.example.hsport.catalog;

import android.os.Bundle;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private CoordinatorLayout coordinatorLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
coordinatorLayout = (CoordinatorLayout) findViewById(R.id.coordinator);
//獲取Button對象
Button button = (Button) findViewById(R.id.submitbutton);
//因為我們讓MainActivity實現了View.OnClickListener這個介面,所以setOnClickListener方法中的參數直接傳入this即可。
button.setOnClickListener(this);
}

//因為MainActivity實現了View.OnClickListener介面,所以在MainActivity中還有要實現該介面中改的onClick方法來處理點擊事件。
@Override
public void onClick(View v) {
Snackbar.make(coordinatorLayout, "你點擊了Button",Snackbar.LENGTH_LONG).setAction("Action", null).show();
}
}
關於如何給組件綁定點擊事件,是Android中的基礎知識,如果你還想更加詳細的了解,推薦你可以去一個叫做秒秒學的教程網站看看,夯實下基礎。

G. 如何在Android上開發屬於自己的定製化啟動器

從最基本的概念角度來講,啟動器其實應該是一款能夠實現以下功能的應用程序:

它代表著一台設備的主屏幕。
它能夠列出並啟動已經安裝在該設備當中的應用程序。

換句話來說,它就是那款用戶按下home按鈕後所顯示的應用程序。除非大家已經安裝了定製化啟動器,否則我們目前正在使用的應該都是Android系統自帶的默認啟動方案。不少設備製造商都會在產品中默認使用由其定製的啟動器,從而確保我們獲得與廠商預期相符的外觀效果與使用感受,例如三星TouchWiz以及HTC
Sense。

在今天的教程中,我們將利用基本用戶界面創建出一款簡單的啟動器,它將由兩部分屏幕構成:

在主屏幕中顯示的是該設備的牆紙圖案。
另一屏幕中顯示的是已經安裝在設備當中的應用程序圖標及其它細節信息。

1.要求

大家需要在自己的開發設備上預先安裝並配置好以下項目:

Android SDK以及平台工具
Eclipse IDE 3.7.2或者更高版本,同時具備ADT插件
運行有Android 2.2或者更高版本的模擬器或者Android設備

大家可以點擊此處通過Android開發者門戶下載對應SDK及平台工具。

2.項目設置

首先我們需要啟動Eclipse並創建一個新的Android應用程序項目。我為這個應用取了個非常直白的名稱——SimpleLauncher,當然大家也可以自由選擇自己想要的名稱。請確保軟體包名稱沒有與其它項目出現重復。我們的啟動器所能支持的最低SDK版本為「凍酸奶」,而主要的面向版本則為「果凍豆」。

由於我們不打算創建Activity,因此取消「Create Activity」勾選項,然後點擊「Finish」以繼續。

3.項目清單

接下來我們需要通過添加兩個activity對AndroidManifest.xml文件進行修改。第一個Activity用於顯示主屏幕,我們如下所示將其命名為HomeActivity。
<activity android:name="ah.hathi.simplelauncher.HomeActivity" android:label="Simple Launcher Home" android:theme="@android:style/Theme.Wallpaper.NoTitleBar.Fullscreen" android:launchMode="singleTask" android:stateNotNeeded="true" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>

通過將android.intent.category.HOME與android.intent.category.DEFAULT兩個類添加至intent-filter組當中,相關Activity得以擁有與啟動器概念相符的運行方式。當大家按下設備上的home按鈕時,其還將作為選項方案顯示出來。

我們還需要將launchMode設置到singleTask當中,從而確保無論何時都只有單一Activity實例由系統負責運行。要顯示用戶的牆紙圖案,大家必須將主題設置為Theme.Wallpaper.NoTitleBar.FullScreen。

我們需要添加的第二個Activity負責顯示已經安裝在用戶設備中的應用程序條目。它還有另一項任務,即啟動這些應用程序。我們不需要對該Activity進行任何特殊配置,將其命名為AppsListActivity即可。
<activity android:name="ah.hathi.simplelauncher.AppsListActivity" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" > </activity>

4.Activity布局

下面在項目的res/layout文件夾中為HomeActivity類創建一個XML文件,並將其命名為activity_home.xml。該布局擁有一個單獨的Button用以響應點觸事件。點觸該按鈕能夠讓用戶由主屏幕切換至應用程序列表。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".HomeActivity" > <Button android:id="@+id/apps_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:layout_marginRight="10dp" android:layout_marginTop="10dp" android:text="Show Apps" android:onClick="showApps" /> </RelativeLayout>

接下來,在項目的res/layout文件夾中為AppsListActivity類創建一個XML文件並將其命名為activity_apps_list.xml。該布局當中包含一個占據整個屏幕的ListView。
<?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:orientation="vertical" > <ListView android:id="@+id/apps_list" android:layout_width="match_parent" android:layout_height="match_parent" > </ListView> </LinearLayout>

最後,在同樣的位置創建第三個XML文件並將其命名為list_item.xml。該文件用於定義ListView當中各個條目的布局方案。列表視圖中的每個條目都代表著已經安裝在用戶設備上的一款應用程序。它能夠顯示該應用程序的圖標、標簽以及軟體包名稱。我們可以利用ImageView實例來顯示該應用的圖標,並通過TextView實例顯示標簽與軟體包名稱。
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dp" > <ImageView android:id="@+id/item_app_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerVertical="true" /> <TextView android:id="@+id/item_app_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/item_app_icon" android:paddingLeft="10dp" /> <TextView android:id="@+id/item_app_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/item_app_label" android:layout_toRightOf="@+id/item_app_icon" android:paddingLeft="10dp" /> </RelativeLayout>

5.創建Acitivity類

HomeActivity

應用程序的布局方案創建完成之後,現在要做的是創建兩個Activity類。當創建這兩個類時,請確保每個類的名稱都與我們之前在項目清單文件中所指定的內容相匹配。

創建一個名為HomeActivity的新類,然後將android.app.Activity設置為其超類。
package ah.hathi.simplelauncher; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; public class HomeActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); } public void showApps(View v){ Intent i = new Intent(this, AppsListActivity.class); startActivity(i); } }

在該類的onCreate方法中,我們調用setContentView並將其傳遞至之前已經創建完成的布局當中。大家可能還記得,我們曾為activity_home布局添加過一個按鈕,用於觸發名為showApps的方法。現在我們要做的是將該方法引入HomeActivity類當中。整個添加過程非常簡單,各位需要做的只是為AppsListActivity類創建一個Intent並付諸運行。

H. android自定義控制項怎麼用

開發自定義控制項的步驟:
1、了解View的工作原理
2、 編寫繼承自View的子類
3、 為自定義View類增加屬性
4、 繪制控制項
5、 響應用戶消息
6 、自定義回調函數

一、View結構原理
Android系統的視圖結構的設計也採用了組合模式,即View作為所有圖形的基類,Viewgroup對View繼承擴展為視圖容器類。
View定義了繪圖的基本操作
基本操作由三個函數完成:measure()、layout()、draw(),其內部又分別包含了onMeasure()、onLayout()、onDraw()三個子方法。具體操作如下:
1、measure操作
measure操作主要用於計算視圖的大小,即視圖的寬度和長度。在view中定義為final類型,要求子類不能修改。measure()函數中又會調用下面的函數:
(1)onMeasure(),視圖大小的將在這里最終確定,也就是說measure只是對onMeasure的一個包裝,子類可以覆寫onMeasure()方法實現自己的計算視圖大小的方式,並通過setMeasuredDimension(width, height)保存計算結果。

2、layout操作
layout操作用於設置視圖在屏幕中顯示的位置。在view中定義為final類型,要求子類不能修改。layout()函數中有兩個基本操作:
(1)setFrame(l,t,r,b),l,t,r,b即子視圖在父視圖中的具體位置,該函數用於將這些參數保存起來;
(2)onLayout(),在View中這個函數什麼都不會做,提供該函數主要是為viewGroup類型布局子視圖用的;

3、draw操作
draw操作利用前兩部得到的參數,將視圖顯示在屏幕上,到這里也就完成了整個的視圖繪制工作。子類也不應該修改該方法,因為其內部定義了繪圖的基本操作:
(1)繪制背景;
(2)如果要視圖顯示漸變框,這里會做一些准備工作;
(3)繪制視圖本身,即調用onDraw()函數。在view中onDraw()是個空函數,也就是說具體的視圖都要覆寫該函數來實現自己的顯示(比如TextView在這里實現了繪制文字的過程)。而對於ViewGroup則不需要實現該函數,因為作為容器是「沒有內容「的,其包含了多個子view,而子View已經實現了自己的繪制方法,因此只需要告訴子view繪制自己就可以了,也就是下面的dispatchDraw()方法;
(4)繪制子視圖,即dispatchDraw()函數。在view中這是個空函數,具體的視圖不需要實現該方法,它是專門為容器類准備的,也就是容器類必須實現該方法;
(5)如果需要(應用程序調用了setVerticalFadingEdge或者setHorizontalFadingEdge),開始繪制漸變框;
(6)繪制滾動條;
從上面可以看出自定義View需要最少覆寫onMeasure()和onDraw()兩個方法。

二、View類的構造方法
創建自定義控制項的3種主要實現方式:
1)繼承已有的控制項來實現自定義控制項: 主要是當要實現的控制項和已有的控制項在很多方面比較類似, 通過對已有控制項的擴展來滿足要求。
2)通過繼承一個布局文件實現自定義控制項,一般來說做組合控制項時可以通過這個方式來實現。
注意此時不用onDraw方法,在構造廣告中通過inflater載入自定義控制項的布局文件,再addView(view),自定義控制項的圖形界面就載入進來了。
3)通過繼承view類來實現自定義控制項,使用GDI繪制出組件界面,一般無法通過上述兩種方式來實現時用該方式。

三、自定義View增加屬性的兩種方法:
1)在View類中定義。通過構造函數中引入的AttributeSet 去查找XML布局的屬性名稱,然後找到它對應引用的資源ID去找值。
案例:實現一個帶文字的圖片(圖片、文字是onDraw方法重繪實現)

public class MyView extends View {

private String mtext;
private int msrc;

public MyView(Context context) {
super(context);
}

public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
int resourceId = 0;
int textId = attrs.getAttributeResourceValue(null, "Text",0);
int srcId = attrs.getAttributeResourceValue(null, "Src", 0);
mtext = context.getResources().getText(textId).toString();
msrc = srcId;
}

@Override
protected void onDraw(Canvas canvas) {
Paint paint = new Paint();
paint.setColor(Color.RED);
InputStream is = getResources().openRawResource(msrc);
Bitmap mBitmap = BitmapFactory.decodeStream(is);
int bh = mBitmap.getHeight();
int bw = mBitmap.getWidth();
canvas.drawBitmap(mBitmap, 0,0, paint);
//canvas.drawCircle(40, 90, 15, paint);
canvas.drawText(mtext, bw/2, 30, paint);
}
}

布局文件:

<?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:orientation="vertical" >

<com.example.myimageview2.MyView
android:id="@+id/myView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
Text="@string/hello_world"
Src="@drawable/xh"/>

</LinearLayout>

屬性Text, Src在自定義View類的構造方法中讀取。

2)通過XML為View注冊屬性。與Android提供的標准屬性寫法一樣。
案例: 實現一個帶文字說明的ImageView (ImageView+TextView組合,文字說明,可在布局文件中設置位置)

public class MyImageView extends LinearLayout {

public MyImageView(Context context) {
super(context);
}

public MyImageView(Context context, AttributeSet attrs) {
super(context, attrs);
int resourceId = -1;
TypedArray typedArray = context.obtainStyledAttributes(attrs,
R.styleable.MyImageView);
ImageView iv = new ImageView(context);
TextView tv = new TextView(context);
int N = typedArray.getIndexCount();
for (int i = 0; i < N; i++) {
int attr = typedArray.getIndex(i);
switch (attr) {
case R.styleable.MyImageView_Oriental:
resourceId = typedArray.getInt(
R.styleable.MyImageView_Oriental, 0);
this.setOrientation(resourceId == 1 ? LinearLayout.HORIZONTAL
: LinearLayout.VERTICAL);
break;
case R.styleable.MyImageView_Text:
resourceId = typedArray.getResourceId(
R.styleable.MyImageView_Text, 0);
tv.setText(resourceId > 0 ? typedArray.getResources().getText(
resourceId) : typedArray
.getString(R.styleable.MyImageView_Text));
break;
case R.styleable.MyImageView_Src:
resourceId = typedArray.getResourceId(
R.styleable.MyImageView_Src, 0);
iv.setImageResource(resourceId > 0 ?resourceId:R.drawable.ic_launcher);
break;
}
}
addView(iv);
addView(tv);
typedArray.recycle();
}
}

attrs.xml進行屬性聲明, 文件放在values目錄下

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

<declare-styleable name="MyImageView">
<attr name="Text" format="reference|string"></attr>
<attr name="Oriental" >
<enum name="Horizontal" value="1"></enum>
<enum name="Vertical" value="0"></enum>
</attr>
<attr name="Src" format="reference|integer"></attr>
</declare-styleable>

</resources>

MainActivity的布局文件:先定義命名空間 xmlns:uview="http://schemas.android.com/apk/res/com.example.myimageview2" (com.example.myimageview2為你
在manifest中定義的包名)
然後可以像使用系統的屬性一樣使用:uview:Oriental="Vertical"

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:uview="http://schemas.android.com/apk/res/com.example.myimageview2"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />

<com.example.myimageview2.MyImageView
android:id="@+id/myImageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
uview:Text="這是一個圖片說明"
uview:Src="@drawable/tw"
uview:Oriental="Vertical">
</com.example.myimageview2.MyImageView>

</LinearLayout>

四、控制項繪制 onDraw()

五、
六:自定義View的方法
onFinishInflate() 回調方法,當應用從XML載入該組件並用它構建界面之後調用的方法
onMeasure() 檢測View組件及其子組件的大小
onLayout() 當該組件需要分配其子組件的位置、大小時
onSizeChange() 當該組件的大小被改變時
onDraw() 當組件將要繪制它的內容時
onKeyDown 當按下某個鍵盤時
onKeyUp 當松開某個鍵盤時
onTrackballEvent 當發生軌跡球事件時
onTouchEvent 當發生觸屏事件時
onWindowFocusChanged(boolean) 當該組件得到、失去焦點時
onAtrrachedToWindow() 當把該組件放入到某個窗口時
onDetachedFromWindow() 當把該組件從某個窗口上分離時觸發的方法
onWindowVisibilityChanged(int): 當包含該組件的窗口的可見性發生改變時觸發的方法

I. android里tools:contexts是什麼意思要通俗易懂的解釋

工具屬性
tools:context
這個屬性通常在一個布局XML文件的根元素中設置,記錄了這個布局關聯到哪一個activity(因為顯然一個布局在設計時可以被多個布局使用)(例如它會用於布局編輯器中以推斷默認的主題,由於主題定義在Manifest中,並與activity而不是布局相關聯。你可以和在manifests中一樣使用點前綴,來指定activity類,而不需要使用完整的程序包名作為前綴。
<android.support.v7.widget.GridLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity" ... >
使用:Studio 和 Eclipse的布局編輯器,Lint

閱讀全文

與androidxmlnstools相關的資料

熱點內容
什麼叫雲伺服器和普通服 瀏覽:18
粉紅佳緣是什麼app 瀏覽:562
硬碟在伺服器什麼位置 瀏覽:516
zarchiver解壓縮工具密碼 瀏覽:173
有個app叫彈什麼 瀏覽:169
歷史演義pdf 瀏覽:160
java編程最難的框架 瀏覽:754
linuxutils 瀏覽:172
android表情亂碼 瀏覽:750
播放窗口編程 瀏覽:612
編程和cpu 瀏覽:364
職業病時間怎麼演算法 瀏覽:991
多圖片合成pdf文檔 瀏覽:138
判斷網路命令 瀏覽:452
erp加密鎖聯系方式 瀏覽:20
英菲克怎麼配置桌面伺服器 瀏覽:990
什麼字體是英文可編譯 瀏覽:393
劍三為什麼關不掉伺服器同步 瀏覽:974
安卓怎麼玩蘋果伺服器地址 瀏覽:631
編譯原理與實驗教程答案 瀏覽:230