編輯:關於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 Mapmap = 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 Studio的項目包含了一個應用的所有資源,包括源碼、依賴資源、測試代碼、build的配置等。創建一個新的項目,Android Stu
Volley 是一個 HTTP 庫,它能夠幫助 Android app 更方便地執行網絡操作,最重要的是,它更快速高效。我們可以通過開源的 AOSP 倉庫獲取到 Voll
頭部用的是TabLayout和ViewPager實現的 底部用的是FragmentTabHost和Fragment實現的先看底部的實現:底部布局: <fram
Android Studio與EclipseADT存在著諸多不同之處,這裡列舉一些Android Studio相對Eclipse 比較棒的特性。顏色、圖片在布局和代碼中可