> For the complete documentation index, see [llms.txt](https://johch3n611u.gitbook.io/c50108/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://johch3n611u.gitbook.io/c50108/ju-li-cheng-bei/201904/20190411-an-zhuo-gong-zuo-shi-ui-wei-pai-han-shi-kong-zhi-wu-jian.md).

# 2019/0411/安卓工作室-UI觸發委派函式與控制物件

## 元件與程式控制 app -> java

Java就像c#\&js一樣能夠去改動頁面物件與屬性與方法

button1.setText("已經按下");

文本

button1.setBackgroundColor(0);

樣式

button1.setClickable(false);

方法

Layout 與 java 最大的關聯就是物件id&#x20;

其實兩個是依照

程式設計與介面設計分開分工做事的方式

可以抓到別的介面並不是在顯示的介面的物件id

結果造成執行時就會報錯，造成資源連結失敗

### 介紹能控制的東西&#xD;

#### onfocuschange 焦點方法&#xD;

![](/files/-Ld8V4y-oJxOynjO5Wew)

![](/files/-Ld8V4y0gnXUU71jm49H)

![](/files/-Ld8V4y1tk7bZt1zxr58)

Class 命名時慣例會將第一個字大寫

![](/files/-Ld8V4y2nuR73vwrkCLp)

```
textView1=(TextView)findViewById(R.id.text_1);
```

轉型因為回傳值是一個純值

String … 這些變數 是拿來暫存原值用的 ( 字串型態的類別 需要區分大小寫

事件監聽器所定義的抽象方法內實作委派事件處理函式

hasFocus

如果是true則焦點在 textview1這個物件上

![](/files/-Ld8V4y3lkIhvH79w921)

![](/files/-Ld8V4y4_h1LVo7sZLnv)

Android:focusable=true要設定物件才能真的被選取，有些元件預設是false

TypeValue

工具:用來指定變數值的型態

![](/files/-Ld8V4y5GUFiUm9fW8kD)

```
package com.example.myapplication;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.TypedValue;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.lang.reflect.TypeVariable;

public class Activity_TextView_Java extends AppCompatActivity {


TextView textView1,textView2,textView3;
String text1;
Integer colorText1;
float sizeText3;

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_textview_java);

      textView1=(TextView)findViewById(R.id.text_1);
      textView2=(TextView)findViewById(R.id.text_2);
      textView3=(TextView)findViewById(R.id.text_2);

        text1 = textView1.getText().toString();
        colorText1 = textView2.getCurrentTextColor();
        sizeText3 = 24.0f;

        textView1.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if(hasFocus){textView1.setText("目前焦點:TextView11111");}
                else {textView1.setText(text1);}

            }
        });
        textView2.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if(hasFocus){textView2.setTextColor(0xff0000ff);}
                else {textView2.setTextColor(colorText1);}

            }
        });
        textView3.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if(hasFocus){textView3.setTextSize(30);}
                else {textView3.setTextSize(TypedValue.COMPLEX_UNIT_SP,sizeText3);}

            }
        });


    }


}

```

#### 類似邏輯的實現，點擊右上角qrcode轉換再轉回

![](/files/-Ld8V4y6yMZ6dWvngiVj)

![](/files/-Ld8V4y7X7jWfgzbX8Vw)

更多方法應用

Visibility 能見度

![](/files/-Ld8V4y8cR1AhW-GTjWe)

![](/files/-Ld8V4y9SP92SijD_2cn)

更多的事件

不同元件事件屬性做到相同的事情也是有可能

有用到再去查(較沒有人去記這些東西

![](/files/-Ld8V4yA93hwDMP8G2ol)

![](/files/-Ld8V4yB7l8Uf0QMECSM)

![](/files/-Ld8V4yCjtRWDQCrytB0)

![](/files/-Ld8V4yDkxEDZrrjfSrY)

![](/files/-Ld8V4yENenDqDbROqUU)

![](/files/-Ld8V4yFWjY6M-GWiwBf)

MotionEvent.ACTION\_DOWN&#x20;

手勢.碰觸

Index 1時第一張 2 第二張 …

碰下去就做不同處理

![](/files/-Ld8V4yGdfqfKlKt-Bi-)

也有其他手勢 ( 液晶螢幕可以多點觸控 其實蠻多的 但模擬器只有滑鼠

可以監聽到多點的值

回傳值 void 為空所以不用 return true false

回傳值boolean 所以最後要 return false 不然會報錯

```
textView1.setOnTouchListener(new View.OnTouchListener() {
    @Override
public boolean onTouch(View v, MotionEvent event) {       
return false;
    }
});
```

Motionevent event 這個變數代表手勢的動作變數

![](/files/-Ld8V4yHWkhEuFOtzT3_)

很多種手勢

![](/files/-Ld8V4yI2sm4np6wncKC)

```
package com.example.myapplication;

import android.media.Image;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

public class Activity_ImageView_Java extends AppCompatActivity {


TextView textView1,textView2;
ImageView image;
Integer imageIndex =0 , scaleIndex =0 ;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_imageview_java);

      textView1=(TextView)findViewById(R.id.text_1);
      textView2=(TextView)findViewById(R.id.text_2);
      image=(ImageView)findViewById(R.id.imageview_1);

      textView1.setOnTouchListener(new View.OnTouchListener() {
          @Override
          public boolean onTouch(View v, MotionEvent event) {

if (event.getAction() == event.ACTION_DOWN){
    if(imageIndex==2){
        image.setImageResource(R.drawable.imageview_java_1);
        imageIndex =1 ;
    }else{
        image.setImageResource(R.drawable.imageview_java_2);
        imageIndex =2 ;}
}


              return false;
          }
      });


}}

```

### ide 自動設定的類別定義方法產生

![](/files/-Ld8V4yJKLI7sYswreSC)

![](/files/-Ld8V4yKQPMZKxyZe05T)

View\.OnFocusChangeListener()

這個就是 interface　介面

```
package com.example.myapplication;

import android.media.Image;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

public class Activity_ImageView_Java extends AppCompatActivity {


    TextView textView1, textView2;
    ImageView image;
    Integer imageIndex = 0, scaleIndex = 0;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_imageview_java);

        textView1 = (TextView) findViewById(R.id.text_1);
        textView2 = (TextView) findViewById(R.id.text_2);
        image = (ImageView) findViewById(R.id.imageview_1);

        textView1.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                if (event.getAction() == event.ACTION_DOWN) {
                    if (imageIndex == 2) {
                        image.setImageResource(R.drawable.imageview_java_1);
                        imageIndex = 1;
                    } else {
                        image.setImageResource(R.drawable.imageview_java_2);
                        imageIndex = 2;
                    }
                }


                return false;
            }
        });

        textView2.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus) {
                    if (scaleIndex == 2) {
                        image.setScaleType(ImageView.ScaleType.CENTER);
                        scaleIndex=1;
                    }
                    else{image.setScaleType(ImageView.ScaleType.FIT_XY);
                        scaleIndex=2;}
                }
            }
        });
    }
}

```

CENTER&#x20;

FIT\_XY

差別

![](/files/-LcB7uvltgYJS9-Iu_hG)

![](/files/-Ld8V4yLjxHzfEcPGIR-)

補充其他手勢ACTION\_DOWN ...

![](/files/-Ld8V4yMaWp919d2XrW0)

![](/files/-Ld8V4yNymCzm3_eXTj_)

#### edittext

![](/files/-Ld8V4yODltC2mjG3rlG)

![](/files/-Ld8V4yPdJRMvasVh5qo)

![](/files/-Ld8V4yQpkpcMQVSPGkf)

GetText .toString 取出來的值是字串

ParseInt這個方法可以將字串轉為正數

#### Checkbox&#xD;

選擇改變觸發短暫秀特定訊息

![](/files/-Ld8V4yRGxOT0YxoNXK3)

委派函式都是同一組內容功能

所以改用另外一種方式撰寫

４個按鈕都做同一個委派函式

### 除了這個以上都是用匿名寫法ｃａｌｌｂａｃｋｍｅｔｈｅｒ&#xD;

### 重複呼叫必須用具名寫法ｃａｌｌｂａｃｋｍｅｔｈｅｒ&#xD;

### 下集待續&#xD;
