My son entered the national language text competition this morning.

He thought the test was pretty hard and he couldn't finish the question paper.

To reward him for his courage, we took him to eat the snow ice and he was very happy.

 

*the national language text competition:國語文競賽

*snow ice:雪花冰

 

文章標籤

muchone 發表在 痞客邦 留言(0) 人氣()

I went to play the claw machines when I waited for my son this morning.

Just as I expected, I didn't get anything but it was fun.

We went to the night market near our home to play the pinball machine and bought our dinner.

 

*claw machine:抓娃娃機

*pinball machine:彈珠檯

文章標籤

muchone 發表在 痞客邦 留言(0) 人氣()

Today was a happy day because of absence of my boss.

I finished an android app which was about recognition and translation of text this afternoon.

I have already kept a diary in English for 33 days.

 

*keep a diary:寫日記

文章標籤

muchone 發表在 痞客邦 留言(0) 人氣()

●spinner=>選單清單
1.搭配陣列=>String[] 陣列物件{,,,};
2.ArrayAdapter<泛型> 物件=new ArrayAdapter<泛型>(this,android.R.layout.simple_spinner_item,陣列物件);
(=>收集資料/集合,很像ArrayList)
=>把陣列先放進來
=>只要元件名稱能變成陣列,就能用ArrayAdapter,可以支援很多元件,不限定於spinner
3.物件.setDropdownViewResourc(android.R.layout .simple_spinner .dropdown_item);
=>把陣列內容放進spinner中,這邊的物件是spinner物件(用dropdown的方式顯示)
4.spinner物件.setAdapter(adp物件);=>啟動spinner物件
 
●實作:設計一個下拉選單
public class MainActivity extends AppCompatActivity {
    Spinner spn;
    String [] x={"教育","金融","軍警"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         spn=(Spinner)findViewById(R.id.spn);
        ArrayAdapter<String> ada=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,x);
        ada.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spn.setAdapter(ada);
    }
}
**說明:
1.先抓id,設定陣列內容
2.陣列的類型要看清單內容是甚麼類型,因為大部分下拉選單都是用文字,所以這邊使用String
3.new要在onCreate做,一啟動就載入陣列資料
4.ArrayAdapter<String> =>這邊<>中的類型,要和陣列類型一樣,因為泛型,要收集此類型的資料
5. ArrayAdapter<String> ada=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,x);=>把陣列資料放進ada這個adpter物件,且要使用spinner物件
6. ada.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);=>指定這個物件要用spinner_dropdown元件
7. spn.setAdapter(ada);=>把ada顯示在ui的元件上
 
public class MainActivity extends AppCompatActivity {
Spinner spn;
String [] x={"教育","金融", "服務"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
spn=(Spinner)findViewById(R.id.spn);
ArrayAdapter<String> ada=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,x);
ada.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spn.setAdapter(ada);
spn.setOnItemSelectedListener(L1);
}
Spinner.OnItemSelectedListener L1=new Spinner.OnItemSelectedListener(){
@Override
public void onItemSelected(AdapterView<?> adp, View view, int i, long l) {
String msg=adp.getSelectedItem().toString();
Toast t=Toast.makeText(MainActivity.this,msg,Toast.LENGTH_SHORT);
t.show();
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
 
}
};
}
**說明:
1.這邊要用 OnItemSelectedListener,一樣是匿名類別的作法,前面可加private也可不加
2.這個方法要override兩種, onItemSelected onNothingSelected,有選選項和沒選選項
3. onItemSelected(AdapterView<?> adp, View view, int i, long l)=>()中的 AdapterView<?> adp,因為內容是由Adapter產生給Spinner所以這邊是在等一個 AdapterView的物件進來,adp是一個可以自行決定的物件名稱,代表由上面ada把內容指定給它
4. adp.getSelectedItem().toString(); =>.getSelectedItem()是代表adp抓到的資料,因為是去R檔找的資料,所以會是int,這邊要把它轉成String
5.這邊只是把選單選取後要做甚麼功能完成,但當點下去要執行選單這個動作還沒寫,所以要再加上 spn.setOnItemSelectedListener(L1);
 
**也可在values/string.xml下做陣列,這樣不同業面都能共用這個下拉選單,用下列作法:
string.xml
<resources>
    <string name="app_name">Ex1</string>
    <string-array name="x2">
        <item>教育</item>
        <item>金融</item>
        <item>服務</item>
    </string-array>
</resources>
 
mainactivity.java
//ArrayAdapter<String> ada=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,x);
改成ArrayAdapter<CharSequence> ada=
ArrayAdapter.createFromResource(this,R.array.x2,android.R.layout.simple_spinner_item);
 
**說明:
因為這邊的 .createFromResource()是方法,不是建構式,而且是static,所以不需要new
 
 
*程式參考(gitHub):impelment of spinner
 
 
 
文章標籤

muchone 發表在 痞客邦 留言(0) 人氣()

 
1)說明:
res:操作畫面(UI)有關的資源
drawable:圖片=>JPG,PNG,GIF...
layout:XML=>操作畫面
mipmap:ICON=>APP LOGO
values:每頁所需的標題,專有名稱
a.做兩個可以用按鈕切換的頁面,用values設定文字範本=>values/strings.xml,設定每個要使用文字的元件的代號
<resources>
    <string name="app_name">Test20</string>
    <string name="title1">比賽項目</string>
    <string name="t1_1">足球</string>
    <string name="t1_2">棒球</string>
    <string name="title2">身分別</string>
    <string name="t2_1">男</string>
    <string name="t2_2">女</string>
</resources>
 
**說明:
1.name="代號"
2. <string name="app_name">Test20</string>=>這邊兩個tag中間就是要顯示的內容
3.如果button的文字也想要設定,也可在此設定
 
 
b.切回ui介面使用@string/title1就可以抓到 strings.xml中設定的內容了(如下)
<TextView
    android:id="@+id/textView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="30sp"
    android:text="@string/title1/>
 
c.不用onclick用別的做法切換頁面
private Button.OnClickListener k=new Button.OnClickListener(){
    @Override
    public void onClick(View view) {
        Intent in=new Intent();
        in.setClass(MainActivity.this,P2.class);
        startActivity(in);
    }
};
**說明:
1.因為這個功能只給 MainActivity這個class用,所以可以設定private
2. Button.打完之後精靈抓出來的全部都是按鈕操作的模式,選擇要用的
3. OnClickListener是interface,不能直接new,所以是用匿名類別的作法,實際上是new {}中的內容
4. OnClickListener是在等使用者按下去的動作
5.此時k就成為一個listener物件,裡面有onClick method,這個method就是要做煥頁的動作
 
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    a1=(Button)findViewById(R.id.a1);
    a2=(Button)findViewById(R.id.a2);
    c1=(CheckBox) findViewById(R.id.c1);
    c2=(CheckBox) findViewById(R.id.c2);
    a1.setOnClickListener(k);
}
**說明:
1.按a1時,啟動k物件的內容,要寫在onCreate中,當app啟動時就要執行a1的等待功能
2.a1.setOnclickListener(k)就是在a1設定一個等user按下的功能
 
 
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
   
    a1=(Button)findViewById(R.id.a1);
    a2=(Button)findViewById(R.id.a2);
    c1=(CheckBox) findViewById(R.id.c1);
    c2=(CheckBox) findViewById(R.id.c2);
    a1.setOnClickListener(k);
    a2.setOnClickListener(k2);
 
}
private Button.OnClickListener k=new Button.OnClickListener(){
    @Override
    public void onClick(View view) {
        Intent in=new Intent();
        in.setClass(MainActivity.this,P2.class);
        startActivity(in);
    }
};
private Button.OnClickListener k2=new Button.OnClickListener(){
    @Override
    public void onClick(View view) {
String msg="";
if(c1.isChecked())msg=msg+"足球\n";
if(c2.isChecked())msg=msg+"棒球";
        Toast t=Toast.(MainActivity.this,"welcome to this world",Toast.LENGTH_LONG);
         t.setGravity(Gravity.CENTER,0,0);
         t.show();
}
};
**說明:
可以在下方寫很多功能,直接在上面的按鈕套用想要的功能
 
 
public class P2 extends AppCompatActivity {
    Button b1,b2;
    RadioButton r1,r2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_p2);
        b1=(Button)findViewById(R.id.b1);
        b2=(Button)findViewById(R.id.b2);
        r1=(RadioButton) findViewById(R.id.r1);
        r2=(RadioButton) findViewById(R.id.r2);
        b1.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Intent in=new Intent();
                        in.setClass(P2.this,MainActivity.class);
                        startActivity(in);
                    }
                }
        );
    }
}
**說明:
在第二頁改為,不再new物件給k,直接把listener物件在setOnClickListener中new
 
 
2)顯示訊息=>Tosast(可以搭配if或exception,指定在某些狀況下出現)
a.Toast 物件名稱=Toast.makeText(目前的class.this,"內容",持續時間);
   物件名.show();
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toast t=Toast.makeText(MainActivity.this,"welcome to this world",Toast.LENGTH_LONG);
        t.show();
    }
}
 
b.Toast.makeText(目前的class.this,"內容",時間).show();
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
      Toast.makeText(MainActivity.this,"welcome to this world",Toast.LENGTH_LONG).show();
    }
}
 
c.如果直接用show()會放在最下面,要調整位置可以在show()之前用
=>setGravity(Gravity.位置,x,y)
=>位置:CENTER,LEFT,RIGHT....
=> x從上述指定位置往左(負)右(正)調整
=>y從上述指定位置往上(負)下(正)調整
 
*程式參考(gitHub):values/strings.xml and Toast
 
 
 
文章標籤

muchone 發表在 痞客邦 留言(0) 人氣()

I got the results of my son's midterm exam last night.

They were not as good as I expected.

However, it was a good chance for my son to realize that no pain, no gain.

 

 

*as good as I expectedl:像我預期中那麼好

文章標籤

muchone 發表在 痞客邦 留言(0) 人氣()

●V(View)=>ImageView
1.一定要英文名字
2.要事先存檔,支援多種檔案格式ex:png.gif.jpg...
3.把檔案copy然後可以直接在專案的drawable資料夾上按右鍵選貼上,確定圖片的放置位置後,就會發現檔案已經copy好了
實作(一)用兩個按鈕切換圖片
1.版面做兩個button,然後加入一個imageView,選定要出現的第一張照片
 
2.設定id(pre/next/img)
**onclick=>android:onclick="",可以直接自己輸入
 
3.抓id
**View是所有操作元件的父類別, (View v)是代表在等一個View物件進來,以此為例,就是在按下按鈕的時候會new一個Button出來,然後就會把它抓過去
public class MainActivity extends AppCompatActivity {
    Button pre,next;
    ImageView img;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        pre=(Button)findViewById(R.id.pre);
        next=(Button)findViewById(R.id.next);
        img=(ImageView)findViewById(R.id.img);               
    }
    public void pre(View v){
 
}
public void next(View v){
}
 
4.用setImageResource()函式把照片放進來ex:img.setImageResource(R.drawable.img01);
public class MainActivity extends AppCompatActivity {
    Button pre,next;
    ImageView img;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        pre=(Button)findViewById(R.id.pre);
        next=(Button)findViewById(R.id.next);
        img=(ImageView)findViewById(R.id.img);
 
    }
    int[] s={
    R.drawable.img01,
    R.drawable.img02,
    R.drawable.img03,
    R.drawable.img04,
    R.drawable.img05};
  
     int i=-1;
     public void pre(View v){
    i--;
    if(i<0){i=s.length-1;}
    img.setImageResource(s[i]);
 
}
public void next(View v){
        i++;
        if(i== s.length ){i=0;}
        img.setImageResource(s[i]);
 
}
}
**說明:
1. 用陣列設計可以點一按鈕就換到下一張圖的效果,兩個方法的變數要用同一個全域變數,因為照片是共用的
2.當i==s.length時就要從第一張照片開始,所以指定i=0
3.當i<0時,就要從最後一張照片開始,所以指定i=s.length-1
 
5.安裝桌面圖示,把要用的圖片放在mipmap資料夾下,再去修改manifests下的AndroidManifest.xml檔的
android:icon="@mipmap/logo",斜線後面的名稱即可
若是使用模擬器,要改
android:roundIcon="@mipmap/logo"
 
*程式參考(github):Change Image When Clicking Button
 
文章標籤

muchone 發表在 痞客邦 留言(0) 人氣()

I was keen to quit recently because I was fed up with working here.

There is nothing makes me feel happy at work because we had a overly critical boss.

However, I really want to possess one year experience in Android development in the same company.

 

 

*overly critical:太愛挑剔的

文章標籤

muchone 發表在 痞客邦 留言(0) 人氣()

(一)商品和加購金額的計算頁面
1.可以輸入尺和筆的數量,還有勾選紙/圓規/筆記本,計算總共金額(尺:29元,筆31元,紙加購3份60元,圓規3支60元,筆記本3本60元),先做版面設計
2.設定id和定義變數
public class MainActivity extends AppCompatActivity {
    EditText x,y;
    CheckBox s1,s2,s3;
    Button cal;
    TextView ans;
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        x=(EditText)findViewById(R.id.x);
        y=(EditText)findViewById(R.id.y);
        s1=(CheckBox)findViewById(R.id.s1);
        s2=(CheckBox)findViewById(R.id.s2);
        s3=(CheckBox)findViewById(R.id.s3);
        cal=(Button)findViewById(R.id.cal);
        ans=(TextView)findViewById(R.id.ans);
    }
    public void cal(View v){
       
    }
}
 
3.加入功能
public void cal(View v){
try{
int X=Integer.parseInt(x.getText().toString());
int Y=Integer.parseInt(y.getText().toString());
boolean S1=s1.isChecked();
boolean S2=s2.isChecked();
boolean S3=s3.isChecked();
int sum=29*X+31*Y;
if (S1==true){
  sum=sum+30;
}
if (S2==true){
    sum=sum+60;
}
if (S3==true){
    sum=sum+60;
}
ans.setText("總金額合計="+sum+"元");
}catch (Exception e){
    ans.setText("不可輸入空白");
}
}
**說明:
1.isChecked():boolean確定checkbox是某有被勾選,有勾選為true,沒勾選為false
2.三個為獨立的if互不影響,因為可以複選
3.輸入空白送出會出錯,因為有Exception,所以要用try...catch,雖然不知道Exeception內容,可以直接用最上層的Exception抓
 
 
(二)
1.做一個按鈕可以從主頁跳到下一頁(P2),並且切換回來
 
MainActivity.java
 
public class MainActivity extends AppCompatActivity {
    EditText x,y;
    CheckBox s1,s2,s3;
    Button cal,btnP2;
    TextView ans;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
...
        btnP2=(Button)findViewById(R.id.btnP2);
    }
    public void btnP2(View v){
        Intent in=new Intent();
        in.setClass(MainActivity.this,P2.class);
        startActivity(in);
    }
   ...
}
 
P2.java
public class P2 extends AppCompatActivity {
    Button home;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_p2);
        home=(Button)findViewById(R.id.home);
    }
    public void home(View v){
        Intent in=new Intent();
        in.setClass(P2.this,MainActivity.class);
        startActivity(in);
    }
}
 
2.設計版面,定ID,定義變數(在做radio button時,如果要單選,要先放radio group讓他們變成一個群組)
 
public class P2 extends AppCompatActivity {
    Button home,ok;
    RadioButton b1,b2,b3;
    CheckBox c1,c2,c3;
    TextView ans2;
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_p2);
        home=(Button)findViewById(R.id.home);
        ok=(Button)findViewById(R.id.ok);
        b1=(RadioButton)findViewById(R.id.b1);
        b2=(RadioButton)findViewById(R.id.b2);
        b3=(RadioButton)findViewById(R.id.b3);
        c1=(CheckBox)findViewById(R.id.c1);
        c2=(CheckBox)findViewById(R.id.c2);
        c3=(CheckBox)findViewById(R.id.c3);
        ans2=(TextView)findViewById(R.id.ans2);
    }
    public void home(View v){
        Intent in=new Intent();
        in.setClass(P2.this,MainActivity.class);
        startActivity(in);
    }
 
}
 
3.撰寫程式碼
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_p2);
home=(Button)findViewById(R.id.home);
ok=(Button)findViewById(R.id.ok);
b1=(RadioButton)findViewById(R.id.b1);
b2=(RadioButton)findViewById(R.id.b2);
b3=(RadioButton)findViewById(R.id.b3);
c1=(CheckBox)findViewById(R.id.c1);
c2=(CheckBox)findViewById(R.id.c2);
c3=(CheckBox)findViewById(R.id.c3);
ans2=(TextView)findViewById(R.id.ans2);
}
public void home(View v){
Intent in=new Intent();
in.setClass(P2.this,MainActivity.class);
startActivity(in);
}
public void ok(View v){
String job="";
String interest="";
if (b1.isChecked()){
job="資訊";
}else if(b2.isChecked()){
job="教育";
}else if(b3.isChecked()){
job="金融";
}
 
//if(!(c1.isChecked())&&!(c2.isChecked())&&!(c3.isChecked()))interest=interest+"請選擇任一興趣!";
if(c1.isChecked())interest=interest+" 電影";
if(c2.isChecked())interest=interest+" 運動";
if(c3.isChecked())interest=interest+" 音樂";
ans2.setText("您的職業是:"+job+"\n您的興趣是:"+interest);
}
}
 
(三)練習把網站做成APP(參考:http://163.20.103.193/~chen06/b/standard.htm)
 
*程式參考(github):checkbox & radiobutton
*程式參考(github):網站改寫為App

 

文章標籤

muchone 發表在 痞客邦 留言(0) 人氣()

●android的功能如果要運算或是有要寫必較複雜的函式,可以把class用java寫好在import進來,因為打開很慢測試也不方便
=>m(model):開發jar=>jar/doc
=>v(view):ui(user interface)=>app
=>c(controller)=>使用android=>api=>軟體/硬體=>結合雲端firebase=>import 設計jar(要給android用的盡量設計成內部class且都用static)
 
●寫內部類別時如果忘記怎麼寫可以參考android的R檔寫法,找R檔可以先把android檔案管理模式切換成package,R檔都是註冊元件,不會有java檔
 
●匯入jar檔使用(一定要寫說明文件)
1.先把要匯入的jar檔放到專案下的app/libs下
2.到android檔案管理區,在該jar檔上按右鍵,選add library as...就可以匯入了
 
**如果發現匯入至android時出現*,代表沒有抓到class
 
**因為android目前支援的jar是7.0,但我們做的jar是8.0所以匯入後執行時會有問題
**jar降版本要在專案的properpites中的source/Binary Format改
文章標籤

muchone 發表在 痞客邦 留言(0) 人氣()