# 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;


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET 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?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
