OPhone/Android的學習 1 —初步知識,TextView Button Layout及事件響應
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
OPhone/Android的學習(1)—初步知識,TextView,Button,Layout及事件響應
write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie
中移動強大的號召力讓我暫時停止了前段時間興趣濃厚的圖形程式設計學習,說起來,無論是圖形程式設計還是Android程式設計都算是程式設計領域比較充滿趣味的部分,《C語言專家程式設計》作者就說過,用軟體控制硬體總是程式設計最有樂趣的部分:)圖形程式設計這樣容易出成果,讓自己看到自己的程式展示的方式,也是同樣充滿趣味的,何況,這也算是用軟體控制硬體(顯示卡)的一種方式。
今天繼續Android的學習,因為OPhone與Android相容,那麼就是說,我也是在學習OPhone。。。。。。呵呵
昨天用ADT自動生成的Hello World程式用了很多東西,資源啊,什麼的一大堆,弄得比較複雜,原始碼如下:
package oms.hello;
import android.app.Activity;
import android.os.Bundle;
public class HelloOPhone extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
另外說一句,Eclipse是Windows下我用過的除了VS以外能夠直接帶程式著色複製的IDE程式,一般的開源的都不好用,Eclipse還算是比較強大。這個程式碼是簡單了。。。。。。但是R.layout.main的出現將問題複雜了,我當時就沒有弄清楚Hello Android是怎麼來的,後來才發現實在資源裡面。這點和一般我們寫的程式有點不一樣(可能主要是為了大型程式的設計成這樣的),作為一個Hello World都這樣拐彎抹角就讓人受不了了,Google的Andorid教程中就交給我們了另一個較為直觀的HelloWorld程式,原始碼如下:
package oms.hello;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class HelloOPhone extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText("Hello, Android");
setContentView(tv);
}
}
這樣的程式相對來說就直觀多了,也符合一般的HelloWorld的簡潔,這個程式即使是不瞭解JAVA的人應該也能一眼看明白。
Android中的視窗都叫View,TextView自然是Android的文字顯示視窗。建立TextView的時候將整個HelloOPhone這個Activity的指標傳進了TextView,指定了View的範圍,setText指定了View的文字內容,setContentView將此View設為Activity的內容。。。。其實程式簡潔,描述反而複雜了。
既然HelloWorld用到了TextView,我們來挖掘一下有用的資訊,從Android的Reference中可以看到如下內容:
Known Direct Subclasses
Button, CheckedTextView, Chronometer, DigitalClock, EditText
Known Indirect Subclasses
AutoCompleteTextView, CheckBox, CompoundButton, ExtractEditText, MultiAutoCompleteTextView, RadioButton, ToggleButton
這個一看就牛了,Button,EditText等都是從TextView繼承過來的直接子類,既然用到了TextView了,我們也嘗試用下這兩個看到名字我們就能知道作用的Widget,至於更進一步的CheckBox,RadioButton,ToggleButton也是非常熟悉了,這裡就不看了。
先看看Button,到底能不能有效:
package oms.hello;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
public class HelloOPhone extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new Button(this);
tv.setText("Hello, Android");
setContentView(tv);
}
}
上面的程式顯示出來的效果如下:
左邊的是普通顯示畫面,右邊的是按下後的樣子,很明顯按鈕的特性顯示出來了。。。。呵呵,注意,我僅僅改變了new出來的物件,沒有改變原TextView型別的tv值,因為Button從TextView繼承而來,所以我們可以這樣做。
這個按鈕實在太大了,幾乎已經看不出是個按鈕了。。。。給他瘦瘦身吧。直覺反應的程式應該是下面這樣的:
package oms.hello;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
public class HelloOPhone extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button btn = new Button(this);
btn.setText("Hello, Android");
btn.setWidth(100);
btn.setHeight(100);
setContentView(btn);
}
}
事實上這個程式與上例中一模一樣,還是整個按鈕充滿了整個Activity。思考了一下,可能問題出在setContentView一句上,因為此舉設定了整個內容,這樣相當於拉伸效果,否定了整個按鈕的設定長寬的效果。既然是這樣的思路,那麼自然就需要將Button放入某個容器中,讓Android顯示此容器,用此容器撐滿整個螢幕,然後讓Button屬於此容器的一個子Widget,以調整大小,有了此思路,在文件中一搜索,就出現了目標,有兩個layout類,layout是多麼的熟悉啊,QT中讓人解脫的類,MFC中缺乏導致的對話方塊程式進行縮放程式設計就是噩夢的類。有了目標,嘗試看看,是否如直覺所示。
如下程式,達到了我們的目的:
package oms.hello;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.LinearLayout;
public class HelloOPhone extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout layout = new LinearLayout(this);
Button btn = new Button(this);
btn.setText("Hello, Android");
layout.addView(btn, 100, 50);
setContentView(layout);
}
}
效果如下:
所以說,其實學的東西多了,雜了,其實還有一定作用的,畢竟很多東西是相通的,比如這次的layout,呵呵。
有按鈕了,點了總要有點反應吧,響應個訊息吧。
見下例:
package oms.hello;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
public class HelloOPhone extends Activity implements OnClickListener{
/** Called when the activity is first created. */
boolean isClicked = false;
@Override public void onClick(View v) {
if( v instanceof Button) {
if(!isClicked) {
((Button)v).setText("Hello, New Button.");
isClicked = true;
}
else
{
((Button)v).setText("Hello, Old Button.");
isClicked = false;
}
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout layout = new LinearLayout(this);
Button btn = new Button(this);
btn.setText("Hello, Android");
// 新增一個OnClick事件響應的監聽物件
btn.setOnClickListener(this);
layout.addView(btn, 100, 50);
setContentView(layout);
}
}
這個程式一下子複雜了很多,幾點說明:要響應事件(Event),需要有監聽事件的物件,這個物件在Android中屬於Listener一族的介面類,實現這個類的介面,然後通過setOnxxxxListener指定Listener後,一旦有監聽(Listening)的事件,則相應的函式(即實現介面的那個函式)就會被呼叫,並且,發生事件的物件也會通過引數傳入此函式。上例中有點特殊的是HelloOPhone本身實現了OnClickListener,這樣的話,直接在類中用this表示Listener比較方便(這也是Android文件中提到過的方法),上例實現了一個動態改變的按鈕。效果如下:
首先顯示的是第一個按鈕,點選一下後,顯示的是第二個按鈕,再點選則顯示第三個按鈕,以後的點選,按鈕在第二個按鈕與第三個按鈕間來回切換。
write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie