編輯:關於Android編程
這幾天無聊,於是做了個隨機器,想著以後可能會用的到。
以下是程序的運行截圖


圖1可以通過右上角的菜單轉到圖2 的Activity 。這個程序提供了兩個功能,一個是輸入姓名後隨機出姓名。另一個是產生隨機數。
—————————————————————————————————————————————————————————————————————————————
好的,下面來看下怎麼做吧:
制作工具選的是Android studio.
創建工程的時候選擇Basic activity作為我們的第一個界面,因為Basic activity 提供了 右上角的菜單選項,可以來減少工程量。
首先把各個Activity之間連接好。先右鍵新建兩個Empty activity 。一個用來做隨機數生成器的activity 一個用來做幫助的activity。
右上角的菜單可以通過以下代碼來修改。通過onOptionsItemSelected 方法
@Override
public boolean onOptionsItemSelected(MenuItem item) { //右上角的菜單
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) { //這裡是簡單的隨機數生成器
Intent toEasy = new Intent(this,Main2Activity_easy.class);
startActivity(toEasy);
Toast.makeText(MainActivity.this, "現在是隨機數生成模式", Toast.LENGTH_SHORT).show();
return true;
}else if(id == R.id.help){ //這裡是幫助的activity
Intent toHelp= new Intent(this,Main3Activity_help.class);
startActivity(toHelp);
return true;
}
return super.onOptionsItemSelected(item);
}
這裡,我選擇用向右滑動來返回。
右劃返回,主要的方法是通過OnTouchListener接口來實現。
下面以 幫助 的代碼來示范(部分無關代碼刪除)
package com.example.cw.rands;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
public class Main3Activity_help extends AppCompatActivity implements View.OnTouchListener{
//手指滑動的最小速度
private static final int X_MinSpeed = 200;
//手指滑動最小距離
private static final int X_MinDistance = 150;
//手指落下時的橫坐標
private float X_Down;
//手指移動時的橫坐標
private float X_Move;
//手指拿起時的橫坐標
private float X_away;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3_activity_help);
LinearLayout ll = (LinearLayout)findViewById(R.id.help_layout);
ll.setOnTouchListener(this);
}
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()){
case MotionEvent.ACTION_DOWN:{
X_Down=motionEvent.getX();//獲取落下點的x
break;
}
case MotionEvent.ACTION_UP:
X_away=motionEvent.getX(); //獲取移動的x
int distanceX = (int)(X_away-X_Down);
if(distanceX>X_MinDistance){ //如果落下點和離開點的水平距離大於阈值,就退出這個activity
finish();
return true;
}
break;
default:
break;
}
return true;
}
}
上面代碼的注釋應該已經說明的很清楚了。這裡就不再累述了。
把 隨機數生成器 和 幫助 裡面都加上右滑返回後,我們試著運行下程序,一個基本的框架就弄好了。
下面我們開始實現程序的功能。
首先從簡單的隨機數生成器開始。
首先來到對應的layout裡修改它的布局文件。這裡我們用的線性布局。
通過多個LinearLayout 的嵌套來完成布局。
下面是隨機數生成器布局代碼
下面是隨機數生成器的JAVA代碼
package com.example.cw.rands;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import org.w3c.dom.Text;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main2Activity_easy extends AppCompatActivity implements View.OnTouchListener{
//手指滑動的最小速度
private static final int X_MinSpeed = 200;
//手指滑動最小距離
private static final int X_MinDistance = 150;
//手指落下時的橫坐標
private float X_Down;
//手指移動時的橫坐標
private float X_Move;
//手指拿起時的橫坐標
private float X_away;
//確定按鈕
private Button inputButton;
//隨機按鈕
private Button randButton;
//輸入框
private EditText editText;
//范圍顯示文本
private TextView maxNumberText;
//輸出文本
private TextView outputText;
String text=null;
int maxnum=1;
Long lll=2147483648L;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2_activity_easy);
//實例化各個部件
inputButton=(Button)findViewById(R.id.EasyInputButtom);
randButton=(Button)findViewById(R.id.EasyRandButton);
editText=(EditText)findViewById(R.id.EasyEditText);
maxNumberText= (TextView) findViewById(R.id.EasyMaxNumber);
outputText= (TextView) findViewById(R.id.EasyRandNumber);
//實例化結束
//設置確定范圍的按鈕監聽事件
inputButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
text=editText.getText().toString();
Pattern p = Pattern.compile("[0-9]*");
Matcher m = p.matcher(text);
if(text==null|text.equals("")){ //輸入為空時
Toast.makeText(Main2Activity_easy.this,"輸入為空!",Toast.LENGTH_SHORT).show();
return;
}else if(!m.matches()){ //非法輸入
Toast.makeText(Main2Activity_easy.this,"請輸入小於 2147483648 且大於1的合法整數!",Toast.LENGTH_SHORT).show();
return;
}
else if(text.length()>10){ //非法輸入 大於int的范圍
Toast.makeText(Main2Activity_easy.this,"請輸入小於 2147483648 且大於1的合法整數!",Toast.LENGTH_SHORT).show();
return;
}
else {
//測試當數據為10位時的大小 用Long
Long test= Long.parseLong(text);
if(test>=lll){ //如果超過int范圍
Toast.makeText(Main2Activity_easy.this,"請輸入小於 2147483648 且大於1的合法整數!",Toast.LENGTH_SHORT).show();
return;
}
//測試結束
//下面開始 顯示范圍
editText.setText("");
maxnum = Integer.parseInt(text);
maxNumberText.setText("此時的范圍 [ 0 , "+maxnum+")");
//顯示成功
}
}
});
//下面開始設置隨機按鈕的監聽事件
randButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int randNumbers = (int)(Math.random()*maxnum);
outputText.setText("本次隨機數為: "+randNumbers);
}
});
//下面是滑動屏幕返回的監聽事件
LinearLayout ll = (LinearLayout)findViewById(R.id.Easy_layout);
ll.setOnTouchListener(this);
}
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()){
case MotionEvent.ACTION_DOWN:{
X_Down=motionEvent.getX();//獲取落下點的x
break;
}
case MotionEvent.ACTION_UP:
X_away=motionEvent.getX(); //獲取移動的x
int distanceX = (int)(X_away-X_Down);
if(distanceX>X_MinDistance){
Toast.makeText(this,"離開隨機數生成模式",Toast.LENGTH_LONG).show();
finish();
return true;
}
break;
default:
break;
}
return true;
}
}
隨機數生成器完成後,我們就開始弄我們最精華的部分了——按照名稱來隨機。
首先開始一樣,先布局,下面是布局的代碼
完成布局後開始著手為這些部件添加功能代碼了。
下面是代碼
package com.example.cw.rands;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends AppCompatActivity{
//輸入框
private EditText editText;
//添加按鈕
private Button addButton;
//顯示所有姓名的文本
private TextView nameText;
//刪除按鈕
private Button delButton;
//清空按鈕
private Button clearButton;
//隨機按鈕
private Button randButton;
//隨機姓名顯示文本
private TextView randText;
//map裡的key值
private int key=0;
//輸入框的文本內容
private String edit;
//輸入文本框的總內容
private String sumText;
//名字計數器
private int i=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
//下面開始實例化
//輸入框
editText=(EditText)findViewById(R.id.mainEditText);
//添加按鈕
addButton=(Button) findViewById(R.id.mainInputButton);
//顯示所有姓名的文本
nameText=(TextView)findViewById(R.id.mainShowNameText);
//刪除按鈕
delButton=(Button)findViewById(R.id.mainDelOneNameButton);
//清空按鈕
clearButton=(Button)findViewById(R.id.mainClearAllNameButton);
//隨機按鈕
randButton=(Button)findViewById(R.id.mainRandButton);
//隨機姓名顯示文本
randText=(TextView)findViewById(R.id.mainRandText);
//實例化結束
//下面輸入的名字用map來存儲
final Map map = new HashMap();
i=0;//計數器清零
//設置添加按鈕的監聽事件
addButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
edit=editText.getText().toString();
if(edit.equals("")||edit==null){ //判斷輸入是否為空
Toast.makeText(MainActivity.this,"輸入為空!",Toast.LENGTH_SHORT).show();
return;
}
if(sumText==null){
sumText=" "+edit;
editText.setText("");
}else {
sumText=sumText+" 、"+edit;
editText.setText("");
}
map.put(i,edit); //向map中添加有效數據
i++; //key值增加
nameText.setText("此時隨機對象有: "+sumText);
}
});
//刪除按鈕的監聽事件
delButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(i>0){
i--; //key值減一,根據 hashmap特性,將來添加數據會覆蓋在之前的key和value值上
int i=sumText.lastIndexOf(" ");
sumText=sumText.substring(0,i);
nameText.setText("此時隨機對象有: "+sumText);
randText.setText("");
return;
}else {
Toast.makeText(MainActivity.this,"沒有隨機對象",Toast.LENGTH_SHORT).show();
randText.setText("");
return;
}
}
});
//清空按鈕的監聽事件
clearButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(sumText==null){
Toast.makeText(MainActivity.this,"沒有隨機對象",Toast.LENGTH_SHORT).show();
return;
}
sumText=null;
nameText.setText("此時隨機對象有: ");
randText.setText("");
i=0;
map.clear();
return;
}
});
//隨機按鈕的監聽事件
randButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(i==0){
Toast.makeText(MainActivity.this,"請輸入要隨機的對象名稱!",Toast.LENGTH_SHORT).show();
return;
}
int randNumbers = (int)(Math.random()*i);
String str =map.get(randNumbers).toString();
randText.setText("本次隨機結果為: "+str);
}
});
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "更多問題查看右上角幫助", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) { //右上角的菜單
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) { //這裡是簡單的隨機數生成器
Intent toEasy = new Intent(this,Main2Activity_easy.class);
startActivity(toEasy);
Toast.makeText(MainActivity.this, "現在是隨機數生成模式", Toast.LENGTH_SHORT).show();
return true;
}else if(id == R.id.help){ //這裡是幫助的activity
Intent toHelp= new Intent(this,Main3Activity_help.class);
startActivity(toHelp);
return true;
}
return super.onOptionsItemSelected(item);
}
}
代碼很長。。但注釋也算是比較清楚的了。看懂應該不難。用了Hashmap來存放姓名數據。
接著還有一個 幫助 的activity。相信如果前面兩個會做的話,這個應該很快的。
下面是布局代碼和功能代碼,其中加入了 反饋 和 報警 。增加趣味性。。
package com.example.cw.rands;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
public class Main3Activity_help extends AppCompatActivity implements View.OnTouchListener{
//手指滑動的最小速度
private static final int X_MinSpeed = 200;
//手指滑動最小距離
private static final int X_MinDistance = 150;
//手指落下時的橫坐標
private float X_Down;
//手指移動時的橫坐標
private float X_Move;
//手指拿起時的橫坐標
private float X_away;
//和我聯系
private TextView callMe;
//報警
private TextView call110;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3_activity_help);
callMe=(TextView)findViewById(R.id.Call);
call110=(TextView)findViewById(R.id.CallPlic);
callMe.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String url="mqqwpa://im/chat?chat_type=wpa&uin=聯系人的qq號代替,此處我刪掉了";
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
}
});
call110.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(Intent.ACTION_DIAL,Uri.parse("tel:" + "110"));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
});
LinearLayout ll = (LinearLayout)findViewById(R.id.help_layout);
ll.setOnTouchListener(this);
}
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()){
case MotionEvent.ACTION_DOWN:{
X_Down=motionEvent.getX();//獲取落下點的x
break;
}
case MotionEvent.ACTION_UP:
X_away=motionEvent.getX(); //獲取移動的x
int distanceX = (int)(X_away-X_Down);
if(distanceX>X_MinDistance){
finish();
return true;
}
break;
default:
break;
}
return true;
}
}
那麼,至此,我們全部的工作基本都完成了。為什麼說基本呢?
因為還要自己安裝起來看看有沒有bug和不太友好的地方要修該。
—————————————————————————————————————————————————————————————————————————————
後記
算是第一次自己獨立完成這麼一個Android應用吧。之前在寫計算器應用的時候我還是各種百度,跌跌撞撞才完成,那時對整個一個制作還不是很熟悉。
這次這個程序難度大於計算器,但是大部分代碼都是自己直接敲進去的,很少百度,看來熟練了很多。
這條路還很長,慢慢來吧。
Android項目結構(翻譯)
原文鏈接項目概述一個Android Studio的項目包含了一個應用的所有資源,包括源碼、依賴資源、測試代碼、build的配置等。創建一個新的項目,Android Stu
深入解讀Android的Volley庫的功能結構
Volley 是一個 HTTP 庫,它能夠幫助 Android app 更方便地執行網絡操作,最重要的是,它更快速高效。我們可以通過開源的 AOSP 倉庫獲取到 Voll
仿今日頭條的(一)
頭部用的是TabLayout和ViewPager實現的 底部用的是FragmentTabHost和Fragment實現的先看底部的實現:底部布局: <fram
學習Android Studio開發工具之Activity1
Android Studio與EclipseADT存在著諸多不同之處,這裡列舉一些Android Studio相對Eclipse 比較棒的特性。顏色、圖片在布局和代碼中可