1.0 通過代碼來記錄控件,大抵有以下幾個控件
- TextView 文本顯示
- Button 按鈕
- EditText 文本輸入
- ImageView 插入圖片
- AlertDialog 在當前界面彈出一個對話框,置于所有頁面元素之上,能夠屏蔽掉其他空間的交互能力省店。因此一般用于提示一些非常重要的內(nèi)容或者警告信息嚣崭。比如防止用戶誤刪重要內(nèi)容,在刪除前彈出一個確認對話框懦傍。
- ProgressBar 圓圈進度條
2.0 新建一個項目雹舀,取名隨意,我的叫ViewControl粗俱。
項目目錄如下:
3.0 這里需要在res新建一個文件夾说榆,程序所需的圖片放在“drawable”文件夾,但是這個目錄并沒有指定具體的分辨率寸认,我們新建一個名稱為“drawable-xhdpi”的文件夾签财,把準備好的兩張照片放進去,注意文件名稱不能有空格號废麻,我這個兩張圖片隨便找的荠卷,目前選的都是200px*200px大小的圖片。
4.0 先看activity_main.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<!--android中所有控件都具有android:layout_width和android:layout_height這兩個屬性-->
<!--可選值有三種烛愧,match_parent油宜、wrap_content、fill_parent-->
<!--match_parent == fill_parent怜姿,但fill_parent不推薦使用-->
<!--match_parent:表示控件大小和父類布局的大小一樣-->
<!--wrap_content:當前控件大小剛好包含朱里面的內(nèi)容-->
<!--android:gravity:文字的對齊方式慎冤,可選值有top、bottom沧卢、left蚁堤,right、center等,可以用“|”符號同時指定多個值-->
<!--選擇center表左右和上下都中間對齊但狭,等同于center_vertical|center_horizontal-->
<!--android:textSize:文字大小披诗,android中用sp這個單位-->
<!--android:textColor文字顏色-->
<TextView
android:id="@+id/text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="這是一個文本控件"
android:textColor="#00ff00"
android:textSize="24sp"
app:layout_constraintTop_toTopOf="parent" />
<!--android:textAllCaps:是否使用所有英文字母自動進行大寫轉(zhuǎn)換功能-->
<Button
android:id="@+id/button_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="退出程序"
android:textAllCaps="false"
app:layout_constraintBottom_toBottomOf="parent" />
<!--<!–EditText:用戶輸入和編輯內(nèi)容,并可以在程序中對這些內(nèi)容進行處理立磁。–>-->
<!--<!–應用場景:發(fā)短信呈队、發(fā)微博、聊QQ等–>-->
<!--<!–android:maxLines:指定EditText最大行數(shù)–>-->
<!--android:hint:很輕松就實現(xiàn)輸入框提示唱歧,在輸入后就會消失宪摧。-->
<EditText
android:id="@+id/edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="請在這里隨便敲字,反正不管"
android:maxLines="2"
app:layout_constraintTop_toBottomOf="@+id/text_view" />
<Button
android:id="@+id/button_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="點擊記錄"
android:textAllCaps="false"
app:layout_constraintTop_toBottomOf="@+id/edit_text" />
<!--插入圖片-->
<ImageView
android:id="@+id/image_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/logo200px"
app:layout_constraintTop_toBottomOf="@+id/button_1" />
<Button
android:id="@+id/button_3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="切換圖片"
android:textAllCaps="false"
app:layout_constraintTop_toBottomOf="@+id/image_view" />
//顯示一個進度條
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@+id/button_3"
/>
<Button
android:id="@+id/button_4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="隱藏/顯示進度條"
android:textAllCaps="false"
app:layout_constraintTop_toBottomOf="@+id/progress_bar" />
</android.support.constraint.ConstraintLayout>
4.1 首先看文件頭颅崩,<android.support.constraint.ConstraintLayout>標簽几于,ConstraintLayout是Android Studio 2.2中主要的新增功能之一,所以自動生成的布局文件不再用以前的布局標簽沿后。ConstraintLayout翻譯為 約束布局沿彭,也有人把它稱作 增強型的相對布局,由 2016 年 Google I/O 推出尖滚。扁平式的布局方式膝蜈,無任何嵌套锅移,減少布局的層級,優(yōu)化渲染性能饱搏。從支持力度而言非剃,將成為主流布局樣式,完全代替其他布局推沸。集萬千寵愛于一身的小公舉备绽,完全兼容約束集 LinearLayout(線性布局)和RelativeLayout(相對布局)。
4.2 因為目前我參考的學習資料時郭霖先生的《第一行代碼——Android 第二版》鬓催,大家可以參考下郭霖先生的博文:
Android新特性介紹肺素,ConstraintLayout完全解析
轉(zhuǎn)載請注明出處:http://blog.csdn.net/guolin_blog/article/details/53122387
但在寫這些代碼的時候,我看的是另一篇博文宇驾,比起郭霖大神的顯得很晦澀難懂倍靡,但還是硬著頭皮學會了,而且其實這樣去學會课舍,再回頭看郭霖大神的博文塌西,反而能夠很快從應用層面到代碼層面都可以快速理解,主要是新的布局使編程變得更加容易便捷了筝尾。
Android ConstraintLayout 使用詳解
http://www.reibang.com/p/b884b8c46584
基于此捡需,該標簽就不詳細記錄了。
4.3 控件標簽的說明在代碼里面了筹淫≌净裕總之呢,效果就是這樣了:
5.0 這里我新建了兩個java類损姜,注意饰剥,不是活動,是普通的java類摧阅,在com.example.viewcontrol目錄上右擊捐川,new→Java Class,輸入類名ActivityCollector逸尖,完成。再同樣的方法建立BaseActivity類:
6.0 這里我們先解釋下BaseActivity類瘸右,BaseActivity.java:
package com.example.viewcontrol;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("BaseActivity", getClass().getSimpleName());
ActivityCollector.addActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}
這個類的作用主要是能夠方便開發(fā)人員隨時知道自己目前項目運行時娇跟,哪一個活動位于棧頂,這里需要注意的是太颤,別導錯包苞俘,別導錯包,別導錯包龄章,重要的話說三遍吃谣。
至于其中:
ActivityCollector.addActivity(this);
和
@Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
}
是結(jié)合ActivityCollector類乞封,在用戶創(chuàng)建活動時調(diào)用該類的addActivity()方法,在銷毀活動時岗憋,調(diào)用removeActivity()方法肃晚。
7.0 類主要作用是實時掌控所有的活動,并在需要時仔戈,可以殺死所有的活動关串,一次性銷毀,而不需要按Back鍵很多次直到返回棧清空监徘。ActivityCollector.java:
package com.example.viewcontrol;
import android.app.Activity;
import java.util.ArrayList;
import java.util.List;
public class ActivityCollector {
public static List<Activity> activities = new ArrayList<>();
//添加活動
public static void addActivity(Activity activity){
activities.add(activity);
}
//移除活動
public static void removeActivity(Activity activity){
activities.remove(activity);
}
//銷毀所有活動
public static void finishAll(){
for (Activity activity:activities){
if (!activity.isFinishing()){
activity.finish();
}
}
}
}
可以看到晋修,里面都設(shè)置成為靜態(tài)方法,并利用數(shù)組作為模擬的返回棧存儲活動凰盔,我們可以直接調(diào)用類名點方法名直接調(diào)用墓卦,而不需要去創(chuàng)建實例。
8.0 這里是大頭户敬,MainActivity.java
package com.example.viewcontrol;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.Toast;
public class MainActivity extends BaseActivity {
private EditText editText;
private ImageView imageView;
private ProgressBar progressBar;
private int a = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button1 = (Button) findViewById(R.id.button_1);
//存儲輸入的內(nèi)容
editText = (EditText) findViewById(R.id.edit_text);
imageView = (ImageView) findViewById(R.id.image_view);
progressBar = (ProgressBar) findViewById(R.id.progress_bar);
//獲取輸入的內(nèi)容
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//提示打印
String inputText = editText.getText().toString();
Toast.makeText(MainActivity.this, inputText, Toast.LENGTH_SHORT).show();
}
});
// 點擊退出程序落剪,交互性提示
Button button2 = (Button) findViewById(R.id.button_2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//創(chuàng)建AlertDialog實例
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
// 設(shè)置標題
dialog.setTitle("提示");
// 設(shè)置內(nèi)容
dialog.setMessage("確定退出APP?");
// 是否可以用Back鍵關(guān)閉對話框
dialog.setCancelable(false);
// 設(shè)置確認按鈕的點擊事件
dialog.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCollector.finishAll();
// 殺掉當前進程代碼,killProcess()方法
android.os.Process.killProcess(android.os.Process.myPid());
}
});
// 設(shè)置取消按鈕的點擊事件
dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
//配置好后用show()方法將電話框顯示出來
dialog.show();
}
});
// 點擊切換圖片
Button button3 = (Button) findViewById(R.id.button_3);
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (a == 1) {
imageView.setImageResource(R.drawable.qq2);
a = 0;
} else {
imageView.setImageResource(R.drawable.logo200px);
a = 1;
}
}
});
//隱藏/顯示進度條
Button button4 = (Button) findViewById(R.id.button_4);
button4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 這里在書上案例還用了用的ProgressDialog類山叮,但在api-28時著榴,提示,這個方法自api-26起被棄用
// 如果想模仿ProgressDialog出現(xiàn)時屁倔,用戶無法與界面繼續(xù)交互的效果脑又,百度
if (progressBar.getVisibility() == View.GONE) {
progressBar.setVisibility(View.VISIBLE);
} else {
progressBar.setVisibility(View.GONE);
}
}
});
}
}
8.1 首先代碼中創(chuàng)建了四個私有變量,說明這四個變量只需要在這個類中使用即可锐借。
private EditText editText; //EditText 輸入框?qū)嵗? private ImageView imageView; //圖片實例
private ProgressBar progressBar; //交互提示
private int a = 1; //一個簡單的計數(shù)器问麸,用于圖片切換時使用的變量。
8.2 下列類似的內(nèi)容都是為了綁定布局文件中的控件钞翔,也不多說严卖。
Button button1 = (Button) findViewById(R.id.button_1);
//存儲輸入的內(nèi)容
editText = (EditText) findViewById(R.id.edit_text);
imageView = (ImageView) findViewById(R.id.image_view);
progressBar = (ProgressBar) findViewById(R.id.progress_bar);
8.3 我們看對內(nèi)容為“點擊記錄”按鈕進行監(jiān)控的代碼:
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//提示打印
String inputText = editText.getText().toString();
Toast.makeText(MainActivity.this, inputText, Toast.LENGTH_SHORT).show();
}
});
editText實例存儲了輸入框輸入的內(nèi)容,相當于臨時數(shù)據(jù)的保存布轿,我們可以及時操作臨時數(shù)據(jù)哮笆,以免丟失。
通過調(diào)用getText()和toString()方法汰扭,將輸入框的內(nèi)容保存稠肘,并用Toast提示打印出來(當然,你也可以進行其他操作萝毛,比如保存)
實現(xiàn)效果:
8.4 我們看對內(nèi)容為“退出程序”按鈕進行監(jiān)控的代碼项阴,這個按鈕在屏幕的左下角:
// 點擊退出程序,交互性提示
Button button2 = (Button) findViewById(R.id.button_2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//創(chuàng)建AlertDialog實例
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
// 設(shè)置標題
dialog.setTitle("提示");
// 設(shè)置內(nèi)容
dialog.setMessage("確定退出APP?");
// 是否可以用Back鍵關(guān)閉對話框
dialog.setCancelable(false);
// 設(shè)置確認按鈕的點擊事件
dialog.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCollector.finishAll();
// 殺掉當前進程代碼笆包,killProcess()方法
android.os.Process.killProcess(android.os.Process.myPid());
}
});
// 設(shè)置取消按鈕的點擊事件
dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
//配置好后用show()方法將電話框顯示出來
dialog.show();
}
});
除了上圖講述以外环揽,在“確定”選項還有操作代碼:
dialog.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCollector.finishAll();
// 殺掉當前進程代碼略荡,killProcess()方法
android.os.Process.killProcess(android.os.Process.myPid());
}
});
這里第一句調(diào)用ActivityCollector類里面的finishAll()方法,殺掉所有的活動 == 返回棧清空歉胶。
第二句看著用吧汛兜,詳細解釋我也不知道,但是——這個killProcess()方法只能用于殺掉當前程序的進程跨扮。這樣兩句代碼徹底將該應用程序鎖占用的所有資源全部釋放出來序无,做個好人哦不,做個好APP衡创。
8.5 接著看對內(nèi)容為“切換圖片”按鈕進行監(jiān)控的代碼帝嗡,這個按鈕在圖片的下面:
// 點擊切換圖片
Button button3 = (Button) findViewById(R.id.button_3);
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (a == 1) {
imageView.setImageResource(R.drawable.qq2);
a = 0;
} else {
imageView.setImageResource(R.drawable.logo200px);
a = 1;
}
}
});
這里用變量a做一個簡單的圖片切換效果而已
這里調(diào)用imageView類的setImageResource()方法,來修改圖片控件里的圖片
8.6 接著看對內(nèi)容為“隱藏/顯示進度條”按鈕進行監(jiān)控的代碼璃氢,這個按鈕在圖片的下面:
//隱藏/顯示進度條
Button button4 = (Button) findViewById(R.id.button_4);
button4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 這里在書上案例還用了用的ProgressDialog類哟玷,但在api-28時,提示一也,這個方法自api-26起被棄用
// 如果想模仿ProgressDialog出現(xiàn)時巢寡,用戶無法與界面繼續(xù)交互的效果,百度
if (progressBar.getVisibility() == View.GONE) {
progressBar.setVisibility(View.VISIBLE);
} else {
progressBar.setVisibility(View.GONE);
}
}
});
在郭霖先生的《第一行代碼——Android 第二版》書中除了上面鎖控制的轉(zhuǎn)圈的進度條椰苟,還有一個ProgressDialog進度條抑月,他的功能時除了彈出圈圈之外,還位于所有頁面元素頂端舆蝴,封死其他頁面操作谦絮。但不推薦用,我也不去實現(xiàn)它了洁仗。至于取代方案层皱,沒有去研究學習,暫且放下赠潦。
8.7 在8.6的代碼中叫胖,getVisibility()方法用于判斷ProgressBar是否可見,如果可見她奥,就設(shè)置為不可見狀態(tài)瓮增,如果不可見,就設(shè)置為可見狀態(tài)哩俭。運行狀況如下: