文章目錄
- 一、安裝后修改配置
- (1)第一種修改方式:
- (2)第二種修改方式:
- 二、用戶界面基礎
- (1)UI界面
- (2)View視圖
- (3)常用資源存盤
- (4)Android程式結構
- 三、界面布局
- (1)線性布局(LinearLayout)
- (2)單幀布局(FrameLayout)
- (3)表格布局(TableLayout)
- (4)相對布局(RelativeLayout)
- (5)坐標布局(AbsoluteLayout)
- (6)網格布局(GridLayout)
- 四、界面控制元件
- (1)TextView以及子類
- 1.常用屬性:
- 2.shape資源檔案屬性:
- 3.CheckedTextView:
- 4.文本框(EditText)
- 5.按鈕及點擊事件(Button)
- 6.背景選擇器(selector)
- 7.單選框(RadioButton)
- 8.復選框(CheckBox)
- (2)ImageView以及子類
- 1.ImageButton
- (3)AdapterView以及子類
- 1.ListView
- 1.1使用entries屬性實作(下面幾種基于此頁面實作)
- 1.2使用ArrayAdapter實作
- 1.3使用SimpleAdapter實作
- 1.4使用BaseAdapter實作
- 1.5使用LivstActivity實作
- (4)Toast資訊提醒機制
- (5)AlertDialog對話框
- 1.普通對話框
- 2.單選對話框
- 3.多選對話框
- 4.自定義對話框
Android studio程式及jdk:
提取碼:dfjk
Android studio常用快捷鍵:
一、安裝后修改配置
(1)第一種修改方式:
下面兩個博客可以一次性解決版本不同的問題,可以參考一下
參考1:
參考2:
(2)第二種修改方式:
*每次創建專案都要重新修改

二、用戶界面基礎
(1)UI界面
? UI(User Interface)是介于用戶與硬體而設計彼此之間互動溝通的相關軟體,
? 目的在于用戶能夠方便有效率地去操作硬體以達成雙向互動,完成希望借助硬體完成的作業,
? 在Android應用中,界面是由布局和控制元件組成的,
(2)View視圖
? 所有的UI元素都是通過View與ViewGroup構建的,對于一個Android應用的用戶界面來說,ViewGroup作為容器盛裝界面中的控制元件,它可以包含普通的View控制元件,也可以包含ViewGroup,


? Android應用的每個界面的根元素必須有且只有一個ViewGroup容器,
(3)常用資源存盤

(4)Android程式結構


三、界面布局

? Android系統提供的6種常用布局直接或者間接繼承自
ViewGroup,因此它們也支持在ViewGroup中定義的屬性,
這些屬性可以看作是布局的通用屬性,

(1)線性布局(LinearLayout)
? 線性布局(LinearLayout)主要以水平或垂直方式來顯示界面中的控制元件,
設定控制元件排列方式:
“vertical”控制元件垂直排列時,顯示順序依次為從上到下,
”horizontal“控制元件水平排列時,顯示順序依次為從左到右
android:orientation="vertical"
例如:(textAllCaps=“false” 設定字母小寫)

(2)單幀布局(FrameLayout)
? 幀布局(FrameLayout)用于在螢屏上創建一塊空白區域,添加到該區域中的每個子控制元件占一幀,這些幀會一個一個疊加在一起,后加入的控制元件會疊加在上一個控制元件上層
所有控制元件都默認顯示在螢屏左上角,
定義格式:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
屬性 ="屬性值">
</FrameLayout>
例如:

(3)表格布局(TableLayout)
? 采用行、列的形式來管理控制元件,它不需要明確宣告包含多少行、多少列,而是通過在TableLayout布局中添加TableRow布局來控制表格的行數,通過在TableRow布局中添加控制元件來控制表格的列數,
定義格式:
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
屬性 = ”屬性值”>
<TableRow>
UI控制元件
</TableRow>
......
</TableLayout>


(4)相對布局(RelativeLayout)
? 相對布局(RelativeLayout)是通過相對定位的方式指定子控制元件
位置,即以其它控制元件或父容器為參照物,擺放控制元件位置,
定義格式:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
屬性 = "屬性值"
......>
</RelativeLayout>
控制元件位置屬性:

例如:

(5)坐標布局(AbsoluteLayout)
? 坐標布局的子控制元件需要指定相對于此坐標布局的橫、縱坐標值,
否則將會像FrameLayout那樣被排在左上角,手機的應用程式需
要適用于不同的螢屏大小,而這種布局模型不能自適應螢屏尺
寸大小,因此應用的比較少
定義格式:
<AbsoluteLayout mlns:android="http://schemas.android.com/apk/res/android"
屬性 = "屬性值"
......>
</AbsoluteLayout>
例如:

(6)網格布局(GridLayout)
? 網格布局將整個界面劃分成rows*columns個網格,每個網格可
以設定一個組件,除此之外,也可以設定一個組件橫跨多少列,
一個組件縱跨多少行,提供了setRowCount(int)和
setColumnCount(int)方法來控制網路的行數量和列數量,該布局
中的子控制元件可以不用設定寬度和高度,
定義格式:
<GridLayout mlns:android="http://schemas.android.com/apk/res/android"
屬性 = "屬性值"
......>
</GridLayout>
常用屬性:

例如:

四、界面控制元件
(1)TextView以及子類
TextView的子類: CheckedTextView、EditText、Button,
Button的子類:CheckBox,RadioButton
1.常用屬性:
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-YhOnwnQF-1634219309366)(C:\Users\Administrator\Pictures\img\image-20211014135619224.png)]](https://img.uj5u.com/2021/10/17/2749151708543219.png)
*single:單行模式
*ellipsize:設定文字縮略方式
值為marquee時,需要配合marqueeRepeatLimit、focusable、focusableInTouchMode屬性實作文字滾動效果
*autoLink:設定文本內容中的郵箱、電話等鏈接
*background:默認情況下,TextView是不帶邊框的,如果想設定邊框,需要為TextView設定一個背景圖片,該圖片只是一個邊框, 為文本框設定背景資源,背景圖片可以使用shape資源檔案作為圖片使用
2.shape資源檔案屬性:
(1)stroke :邊框效果 相當于html中的盒子模型的border
屬性: android:width:描邊的寬度
android:color:描邊的顏色
android:dashWidth:表示邊框的樣式是虛線的寬度,
值為0時,表示為實線,
值大于0則為虛線,
android:dashGap :表示描邊為虛線時, 虛線之間的間隔 即"- - - "
(2)padding :內部邊距,即內容與邊的距離
屬性: android:left :左內邊距
android:top :上內邊距
android:right:右內邊距
android:bottom :下內邊距
(3)corners : 圓角
屬性:android:radius:半徑
android:topLeftRadius :左上角半徑
android:topRightRadius :右上角半徑
android:bottomLeftRadius :右下角半徑
android:bottomRightRadius :左下角半徑
(4)solid :內部填充
屬性 android:color :填充顏色
(5)gradient : 漸變色
屬性: android:startColor : 起始顏色
android:endColor :結束顏色
android:centerColor :漸變中間顏色
android:angle :漸變角度(PS:當angle=0時,漸變色是從左向右,
然后逆時針方向轉,當angle=90時為從下往上,angle必須為45的
整數倍)
屬性: android:type : 漸變型別(取值:linear、radial、sweep)
linear :線性漸變,這是默認設定
radial :放射性漸變,以開始色為中心,
sweep : 掃描線式的漸變,
android:gradientRadius :漸變色半徑.當 android:type=“radial” 時才使用,單獨使用 android:type="radial"會報錯,
? 屬性 android:useLevel :如果要使用LevelListDrawable物件,就要設定為true,設定為true無漸變,false有漸變色
? android:centerX : 漸變中心X點坐標的相對位置
? android:centerY : 漸變中心Y點坐標的相對位置
3.CheckedTextView:
繼承了TextView,增加了check功能
屬性:
*android:checked=“true” :是否被選
*android:checkMark=“?android:attr/listChoiceIndicatorMultiple”: 設定勾選狀態
*android:clickable=“true”:是否可以被點擊
注意:添加CheckedTextView的OnClickListener事件,
在onClick方法中呼叫toggle()方法:用于切換選擇的狀態
Toast是Android系統提供的輕量級資訊提醒機制,用于向用戶提示即時訊息,它顯示在應用程式界面的最上層,顯示一段時間后自動消失不會打斷當前操作,也不獲得焦點,
例如:
private CheckedTextView ch_tv;
ch_tv=findViewById(R.id.ch_tv);
ch_tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//狀態切換
ch_tv.toggle();
if(ch_tv.isChecked())
Toast.makeText(TvActivity.this,"音效已開啟",Toast.LENGTH_LONG).show();
else
Toast.makeText(TvActivity.this,"音效已關閉",Toast.LENGTH_LONG).show();
}
});
<CheckedTextView
android:id="@+id/ch_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
android:checked="false"
android:clickable="true"
android:text="是否打開音效"
android:textSize="30sp"
/>

4.文本框(EditText)
–EditText:繼承了TextView,可以編輯內容的文本框
–EditText組件的常用屬性:

5.按鈕及點擊事件(Button)
–Button控制元件表示按鈕,它繼承自TextView控制元件,既可以顯示文本,又可以顯示圖片,同時也允許用戶通過點擊來執行操作,當Button控制元件被點擊時,被按下與彈起的背景會有一個動態的切換效果,這個效果就是點擊效果 ,
Button的4種點擊事件實作方式:
6.背景選擇器(selector)
Button的點擊效果:
–通過background屬性實作
①使用selector檔案實作Button點擊和釋放是顯示不同效果
②該屬性可以是顏色,靜態圖片和shape的邊框檔案,但是這情況下單擊按鈕不會出現任何效果,


–selector定義的基本格式:
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected=“true”
android:drawable="@color/color1"/>
<item android:state_focused="true"
android:drawable="@color/color2" />
<item android:state_pressed="true"
android:drawable="@color/color3“/>
<item android:drawable="@color/color1" />
</selector>
–selector使用注意事項:
①每個item對應一種狀態
②在定義selector的時候,根據不同的目的,選擇不同的item屬性,例如,為了定義組件的背景,需要使用android:drawable
③statelist中第一個匹配當前狀態的item會被使用,因此,如果第一個item沒有任何狀態特性的話,那么它將每次都被使用,這也是為什么默認的值必須總是在最后
7.單選框(RadioButton)
–RadioButton為單選按鈕,android:checked屬性指定是否選中的狀態,
–RadioGroup是單選組合框,可容納多個RadioButton,并把它們組合在一起,實作單選狀態,
–語法格式
<RadioGroup
android:屬性名稱 ="屬性值"
......>
<RadioButton
android:屬性名稱 ="屬性值"
....../>
......
<RadioGroup/>
例:
xml檔案:
<RadioGroup
android:id="@+id/radioGroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<RadioButton
android:id="@+id/man"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="男"
android:textSize="25sp"
/>
<RadioButton
android:id="@+id/women"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="女"
android:textSize="25sp" />
</RadioGroup>
單選點擊事件:
private RadioGroup radioGroup;
radioGroup=findViewById(R.id.radioGroup);
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
if(checkedId==R.id.man)
Toast.makeText(TvActivity.this,"你選擇的性別為:男",Toast.LENGTH_LONG).show();
if(checkedId==R.id.women)
Toast.makeText(TvActivity.this,"你選擇的性別為:女",Toast.LENGTH_LONG).show();
}
});
8.復選框(CheckBox)
–CheckBox表示復選框,它是Button的子類,用于實作多選功能,通過android:checked屬性指定CheckBox控制元件是否選中的狀態,
private CheckBox checkBox1;
final Set<String> hoppy = new HashSet<String>();
checkBox1= findViewById(R.id.yu);
checkBox1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked)
hoppy.add("羽毛球");
else
hoppy.remove("羽毛球");
Toast.makeText(TvActivity.this,"你的愛好是:"+hoppy,Toast.LENGTH_LONG).show();
}
});
xml檔案:
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:text="羽毛球"
android:id="@+id/yu"/>
換種寫法:
private String hobbys;
private TextView hobby;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_checkbox);
CheckBox checkBox1 = findViewById(R.id.checkbox1);
CheckBox checkBox2 = findViewById(R.id.checkbox2);
CheckBox checkBox3 = findViewById(R.id.checkbox3);
hobby = findViewById(R.id.hobby);
checkBox1.setOnCheckedChangeListener(this);
checkBox2.setOnCheckedChangeListener(this);
checkBox3.setOnCheckedChangeListener(this);
hobbys = new String();
}
@Override
public void onCheckedChanged(CompoundButton bottonView, boolean b) {
String text = bottonView.getText().toString();
if (b) {
if (!hobbys.contains(text)) {
hobbys = hobbys + text;
hobby.setText(hobbys);
}
} else {
if(hobbys.contains(text)){
hobbys = hobbys.replace(text,"");
hobby.setText(hobbys);
}
}
}
xml檔案:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="請選擇興趣愛好"
android:textColor="#FF8000"
android:textSize="18sp"/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/checkbox1"
android:text="羽毛球"
android:textSize="18sp"/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/checkbox2"
android:text="籃球"
android:textSize="18sp"/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/checkbox3"
android:text="乒乓球"
android:textSize="18sp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FF8000"
android:textSize="22sp"
android:text="您選擇的興趣愛好為:"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/hobby"
android:textSize="18sp"
/>
(2)ImageView以及子類
? ImageView表示圖片,它繼承自View,可以加載各種圖片資
源,

1.ImageButton
? ImageButton顯示圖片,它繼承自ImageView,擁有
ImageView的屬性和方法,不過ImageButton有默認的按鈕
外觀,
? 在ImageButton中載入圖片后,圖片周圍有白邊,影響到美觀,解決這個問題的方法有兩種:
?一種方法是將ImageButton的背景改為所需要的圖片,
? 如:android:background="@drawable/XXX"
?第二種方法就是將ImageButton背景改為透明, 這個方法更常用,在XML里;
<ImageButton android:background="#00000000" …/>
例如:

private ImageButton imageButton;
private ImageView imageView;
private int[] images={R.drawable.dog4,R.drawable.dog3,R.drawable.dog2,R.drawable.dog1};
private int count = -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_image);
imageButton = findViewById(R.id.Image_button);
imageView = findViewById(R.id.Image_View);
imageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(count==3) count = -1;
imageView.setImageResource(images[++count]);
}
});
}
xml:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/dog1"
android:id="@+id/Image_View"
/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/start"
android:id="@+id/Image_button"
android:background="#00000000"
/>
(3)AdapterView以及子類
? 繼承了ViewGroup,可以包含其他組件
可以包括多個串列項,并將多個串列項以合適的形式顯示出來
抽象類,
–AdapterView的子類
*AbsListView:ListView,GridView
*AbsSpinner:Spinner,Gallery
1.ListView
? 正如它的名字,一般用于展示串列,比如要展示資料庫中的N條
紀錄,或是列出某個目錄下的檔案等
–ListView采用典型的MVC模式來分離視圖和資料,將資料封裝
在Adapter中,而ListView負責顯示資料,

ListView的實作方式:
使用entries屬性實作
使用ArrayAdapter實作
使用SimpleAdapter實作
使用BaseAdapter實作
使用LivstActivity實作
1.1使用entries屬性實作(下面幾種基于此頁面實作)
activity:
public class DemoListView extends AppCompatActivity {
private ListView list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_listview);
list = findViewById(R.id.list_view);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
switch (position) {
case 0:
//Activity切換
startActivity(new Intent(DemoListView.this,ArrayAdapterActivity.class));
break;
case 1:
startActivity(new Intent(DemoListView.this,SimpleAdapterActivity.class));
break;
case 2:
startActivity(new Intent(DemoListView.this,BaseAdapterActivity.class));
break;
case 3:
startActivity(new Intent(DemoListView.this,List4Activity.class));
break;
}
}
});
}
}
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/arr"
android:divider="#111111"
android:dividerHeight="3dp"
android:listSelector="@drawable/selector1"
android:id="@+id/list_view"
>
</ListView>
arrays.xml檔案:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="arr">
<item>張三</item>
<item>李四</item>
<item>王五</item>
<item>趙六</item>
<item>齊齊</item>
<item>劉八</item>
</string-array>
</resources>
selector1.xml檔案:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/green" android:state_pressed="true">
</item>
<item android:drawable="@drawable/pink" android:state_pressed="false">
</item>
</selector>
效果圖:

1.2使用ArrayAdapter實作
? ArrayAdapter的資料源僅僅是陣列,但可以設定資料的顯示布局,開發者只需要在構造方法里面傳入相應引數即可,ArrayAdapter通常用于適配TextView控制元件,
–ArrayAdapter的構造方法如下:

例:主頁面使用entries屬性實作,然后通過點擊事件實作跳轉

public class ArrayAdapterActivity extends AppCompatActivity {
private ListView list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_listview1);
String[] data = {"平頂山","鄭州","開封","洛陽","南陽"};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_checked,data);
list = findViewById(R.id.list_view1);
list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
list.setAdapter(adapter);
}
}
xml檔案:
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="#111111"
android:dividerHeight="3dp"
android:id="@+id/list_view1">
</ListView>
1.3使用SimpleAdapter實作
–SimpleAdapter資料源不僅僅是陣列,還可以是其他型別的資料,因此在使用SimpleAdapter進行資料適配時,只需要在構造方法中傳入相應的引數即可,SimpleAdapter的構造方法的具體資訊如下

例:

xml檔案1:
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/list_view2"
>
</ListView>
xml檔案2:
<ImageView
android:layout_width="60dp"
android:layout_height="60dp"
android:id="@+id/head1"
/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textColor="#C900A5"
android:id="@+id/name1"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp"
android:id="@+id/desc1"
/>
</LinearLayout>
activity:
public class SimpleAdapterActivity extends AppCompatActivity {
private ListView list2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_simple2_1);
//創建資料
User u1 = new User(R.drawable.head3,"虎頭","一個可愛的小孩");
User u2 = new User(R.drawable.head1,"弄玉","一個擅長音樂的女孩");
User u3 = new User(R.drawable.head2,"李清照","一個擅長文學的女性");
User u4 = new User(R.drawable.head4,"李白","一個浪漫的詩人");
List<Map<String,Object>> data = new ArrayList<>();
Map<String,Object> map1 = new HashMap<>();
map1.put("head",u1.getHead());
map1.put("name",u1.getName());
map1.put("desc",u1.getDesc());
Map<String,Object> map2 = new HashMap<>();
map2.put("head",u2.getHead());
map2.put("name",u2.getName());
map2.put("desc",u2.getDesc());
Map<String,Object> map3 = new HashMap<>();
map3.put("head",u3.getHead());
map3.put("name",u3.getName());
map3.put("desc",u3.getDesc());
Map<String,Object> map4 = new HashMap<>();
map4.put("head",u4.getHead());
map4.put("name",u4.getName());
map4.put("desc",u4.getDesc());
data.add(map1);
data.add(map2);
data.add(map3);
data.add(map4);
SimpleAdapter simpleAdapter =
new SimpleAdapter(this,data,R.layout.layout_simple2_2,
new String[]{"head","name","desc"},new int[]{R.id.head1,R.id.name1,R.id.desc1});
list2 = findViewById(R.id.list_view2);
list2.setAdapter(simpleAdapter);
}
}
1.4使用BaseAdapter實作
–BaseAdapter顧名思義是基本的配接器,他實際上是一個抽象
類,通常在自定義配接器時會繼承BaseAdapter,
–BaseAdapter中的方法

–獲得 LayoutInflater 實體的方式
在實際開發中LayoutInflater這個類還是非常有用的,它的作用類似于findViewById(),不同點是LayoutInflater是用來找res/layout/下的xml布局檔案,并且實體化;而findViewById()是找xml布局檔案下的具體widget控制元件(如Button、TextView等),
具體作用:
1、對于一個沒有被載入或者想要動態載入的界面,都需要使用LayoutInflater.inflate()來載入;
2、對于一個已經載入的界面,就可以使用 Activiyt.findViewById()方法來獲得其中的界面元素,
–獲得 LayoutInflater 實體的方式
1.LayoutInflater inflater = getLayoutInflater();
//呼叫Activity的getLayoutInflater()
2.LayoutInflater localinflater =
(LayoutInflater)context.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
3.LayoutInflater inflater = LayoutInflater.from(context);
例:

xml檔案1:
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/list_view3"
>
</ListView>
xml檔案2:
<ImageView
android:layout_width="60dp"
android:layout_height="60dp"
android:id="@+id/head1"
/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textColor="#C900A5"
android:id="@+id/name1"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp"
android:id="@+id/desc1"
/>
</LinearLayout>
activity:
public class BaseAdapterActivity01 extends BaseAdapter {
private Context context;
private List<User> data;
//實體化xml檔案的物件
private LayoutInflater Inflater;
public BaseAdapterActivity01(Context context, List<User> data) {
this.context = context;
this.data = data;
Inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
return data.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
View v;
if (convertView == null) {
v = Inflater.inflate(R.layout.layout_simple2_2, viewGroup, false);
} else {
v = convertView;
}
//顯示資料
User u = data.get(position);
ImageView image = v.findViewById(R.id.head1);
image.setImageResource(u.getHead());
TextView tv1 = v.findViewById(R.id.name1);
tv1.setText(u.getName());
TextView tv2 = v.findViewById(R.id.desc1);
tv2.setText(u.getDesc());
return v;
}
}
public class BaseAdapterActivity extends AppCompatActivity {
private ListView list3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_base3);
list3 = findViewById(R.id.list_view3);
//創建自定義的配接器
List<User> data = new ArrayList<>();
//創建資料
User u1 = new User(R.drawable.head3,"虎頭","一個可愛的小孩");
User u2 = new User(R.drawable.head1,"弄玉","一個擅長音樂的女孩");
User u3 = new User(R.drawable.head2,"李清照","一個擅長文學的女性");
User u4 = new User(R.drawable.head4,"李白","一個浪漫的詩人");
data.add(u1);
data.add(u2);
data.add(u3);
data.add(u4);
BaseAdapterActivity01 base = new BaseAdapterActivity01(this,data);
list3.setAdapter(base);
}
}
1.5使用LivstActivity實作
–1.ListActivity默認布局中具有ListView,就可以不用指定布局檔案,呼叫setListAdapter為其指定配接器,也可以自定義布局方式,需要手動在布局檔案中添加id為@android:id/list的ListView控制元件
–2.呼叫setListAdapter為其指定配接器,
android.R.layout.simple_list_item_2:顯示兩個文本框的布
局,當ListView中的資料為空時,顯示其他的組件,如下例:
指定該組件的id號為@android:id/empty
<TextView android:id="@android:id/empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="No items."/>
例:

xml檔案:
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@android:id/list">
</ListView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@android:id/empty"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="添加聯系人"/>
activity:
public class List4Activity extends ListActivity {
private String[] names={"張三","李四","王五","趙六"};
private String[] phone={"13949983175","18317617022","15660097813","12345678912"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_list4);
List<Map<String,Object>> data = new ArrayList<>();
for(int i=0;i<names.length;i++){
Map<String,Object> map =new HashMap<>();
map.put("names",names[i]);
map.put("phone",phone[i]);
data.add(map);
}
SimpleAdapter simpleAdapter =new SimpleAdapter(this,data,
android.R.layout.simple_expandable_list_item_2,new String[]{"names","phone"},
new int[] {android.R.id.text1,android.R.id.text2});
setListAdapter(simpleAdapter);
}
}
(4)Toast資訊提醒機制

例:
//TvActivity 當前activity
Toast.makeText(TvActivity.this,"音效已開啟",Toast.LENGTH_LONG).show();
(5)AlertDialog對話框


1.普通對話框
? 內容區域一般顯示簡單的文本資訊,通過setMessage()方法設定,
例:回傳的時候彈出界面

@Override
public void onBackPressed() {
//super.onBackPressed();回傳上一個界面
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(R.mipmap.ic_launcher)
.setTitle("普通對話框")
.setMessage("是否確定退出應用")
.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
commonDialogActivity.this.finish();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
2.單選對話框
? 單選對話框的內容區域顯示為單選串列,單選串列通過AlertDialog.Builder物件呼叫setSingleChoiceItems()方法設定,
例:

public class StringleChoiceDialog extends AppCompatActivity implements View.OnClickListener {
private int textsize = 1;
private int[] textsizeArr = {10, 20, 25, 30, 40};
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_stringlechoicedialog);
textView = findViewById(R.id.tv);
Button button = findViewById(R.id.bt);
button.setOnClickListener(this);
}
@Override
public void onClick(View view) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(R.mipmap.ic_launcher)
.setTitle("單選對話框")
.setSingleChoiceItems(new String[]{"小號", "默認", "中號", "大號", "超大"}, textsize, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
textsize = i;
}
})
.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
int size = textsizeArr[textsize];
textView.setTextSize(size);
dialogInterface.dismiss();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
}
3.多選對話框
? 多選對話框的內容區域顯示為多選串列,多選串列通過AlertDialog.Builder物件呼叫setMultiChoiceItem()方法設定的
例:

public class MultichChoiceDialog extends AppCompatActivity implements View.OnClickListener {
private CharSequence[] items = new CharSequence[]{"旅游","美食","看電影","運動"};
private boolean[] checkedItems = new boolean[]{false,true,false,false};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_multichchoicedialog);
findViewById(R.id.bt).setOnClickListener(this);
}
@Override
public void onClick(View view) {
AlertDialog alertDialog;
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(R.mipmap.ic_launcher)
.setTitle("請選擇興趣愛好")
.setMultiChoiceItems(items, checkedItems,
new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int j, boolean b) {
checkedItems[j] = b;
}
})
.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int which) {
StringBuffer stringBuffer = new StringBuffer();
for(int i = 0 ;i<=checkedItems.length-1;i++){
if(checkedItems[i]){
stringBuffer.append(items[i]).append("");
}
}
if(stringBuffer!=null){
Toast.makeText(MultichChoiceDialog.this," "+stringBuffer,
Toast.LENGTH_SHORT).show();
}
dialogInterface.dismiss();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
}
4.自定義對話框
? 在Android程式中由于界面風格的不同,一般不直接使用系統提供的對話框,而是根據專案需要定義相應的對話框樣式
例:

CustomDialogActivit類:
public class CustomDialogActivity extends AlertDialog {
private TextView titleTv;//顯示的標題
private TextView messageTv;//顯示的是資訊
private Button negtiveBn, positiveBn;//確認和訊息按鈕
private String message;
private String title;
private String positive, negtive;//確定,取消
public CustomDialogActivity setMessage(String message) {
this.message = message;
return this;
}
public CustomDialogActivity setTitle(String title) {
this.title = title;
return this;
}
public CustomDialogActivity setPositive(String positive) {
this.positive = positive;
return this;
}
public CustomDialogActivity setNegtive(String negtive) {
this.negtive = negtive;
return this;
}
protected CustomDialogActivity(@NonNull Context context) {
super(context);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.custom_dialog);
initView();
initEvent();
}
//初始化界面
private void initView() {
titleTv = (TextView) findViewById(R.id.title);
messageTv = (TextView) findViewById(R.id.message);
negtiveBn = (Button) findViewById(R.id.negtive);
positiveBn = (Button) findViewById(R.id.positive);
}
//設定點擊確定按鈕和取消按鈕的監聽器
public interface OnClickBottomListener {
void onPositivateClick();//實作確定按鈕點擊事件的方法
void onNegtiveClick();//確定取消按鈕點擊事件的方法
}
//設定確定取消按鈕的回呼
public OnClickBottomListener onClickBottomListener;
public CustomDialogActivity setOnClickBottomListener(OnClickBottomListener onClickBottomListener) {
this.onClickBottomListener = onClickBottomListener;
return this;
}
//初始化界面的確定和取消監聽器
private void initEvent() {
//設定確定按鈕的點擊事件的監聽器
positiveBn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (onClickBottomListener != null) {
onClickBottomListener.onPositivateClick();
}
}
});
//設定取消按鈕的點擊事件的監聽器
negtiveBn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (onClickBottomListener != null) {
onClickBottomListener.onNegtiveClick();
}
}
});
}
private void refreshView() {
//如果自定義了title和message會顯示自定義的資訊,否則不顯示title和message的資訊
if (!TextUtils.isEmpty(title)) {
titleTv.setText(title); //設定標題控制元件的文本為自定義的title
titleTv.setVisibility(View.VISIBLE); //標題控制元件設定為顯示狀態
} else {
titleTv.setVisibility(View.GONE);//標題控制元件設定為隱身狀態
}
if (!TextUtils.isEmpty(message)) {
messageTv.setText(message); //設定訊息控制元件的文本自定義的message資訊
}
//如果自定義了按鈕的文本,則按鈕顯示自定義的文本,否則,按鈕顯示“確定”或“取消”文本
if (!TextUtils.isEmpty(positive)) {
positiveBn.setText(positive); //設定按鈕的文本為自定義的文本是資訊
} else {
positiveBn.setText("確定"); //設定按鈕文本為“確定”
}
if (!TextUtils.isEmpty(negtive)) {
negtiveBn.setText(negtive);
} else {
negtiveBn.setText("取消");
}
}
public void show() {
super.show();
refreshView();
}
}
CustomDialog類:
public class CustomDialog extends AppCompatActivity implements View.OnClickListener {
private RadioGroup radioGroup;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_customdialog);
findViewById(R.id.btn_dialog).setOnClickListener(this);
}
@Override
public void onClick(View view) {
final CustomDialogActivity customDialogActivity = new CustomDialogActivity(CustomDialog.this);
customDialogActivity.setTitle("提示");
customDialogActivity.setMessage("您確定要洗掉資訊?");
customDialogActivity.setNegtive("取消");
customDialogActivity.setPositive("確定");
customDialogActivity.setOnClickBottomListener(new CustomDialogActivity.OnClickBottomListener() {
@Override
public void onPositivateClick() {
//確定按鈕
customDialogActivity.dismiss();
}
@Override
public void onNegtiveClick() {
//取消按鈕
customDialogActivity.dismiss();
}
});
customDialogActivity.show();
}
}
后續筆記會持續更新,希望大家給個一鍵三連!!!!!

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/319858.html
標籤:其他
上一篇:父子類上下強制轉換訪問權限問題
