2019/0411/安卓工作室-UI觸發委派函式與控制物件
元件與程式控制 app -> java
Java就像c#&js一樣能夠去改動頁面物件與屬性與方法
button1.setText("已經按下");
文本
button1.setBackgroundColor(0);
樣式
button1.setClickable(false);
方法
Layout 與 java 最大的關聯就是物件id
其實兩個是依照
程式設計與介面設計分開分工做事的方式
可以抓到別的介面並不是在顯示的介面的物件id
結果造成執行時就會報錯,造成資源連結失敗
介紹能控制的東西
onfocuschange 焦點方法



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

textView1=(TextView)findViewById(R.id.text_1);轉型因為回傳值是一個純值
String … 這些變數 是拿來暫存原值用的 ( 字串型態的類別 需要區分大小寫
事件監聽器所定義的抽象方法內實作委派事件處理函式
hasFocus
如果是true則焦點在 textview1這個物件上


Android:focusable=true要設定物件才能真的被選取,有些元件預設是false
TypeValue
工具:用來指定變數值的型態

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轉換再轉回


更多方法應用
Visibility 能見度


更多的事件
不同元件事件屬性做到相同的事情也是有可能
有用到再去查(較沒有人去記這些東西






MotionEvent.ACTION_DOWN
手勢.碰觸
Index 1時第一張 2 第二張 …
碰下去就做不同處理

也有其他手勢 ( 液晶螢幕可以多點觸控 其實蠻多的 但模擬器只有滑鼠
可以監聽到多點的值
回傳值 void 為空所以不用 return true false
回傳值boolean 所以最後要 return false 不然會報錯
textView1.setOnTouchListener(new View.OnTouchListener() {
    @Override
public boolean onTouch(View v, MotionEvent event) {       
return false;
    }
});Motionevent event 這個變數代表手勢的動作變數

很多種手勢

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 自動設定的類別定義方法產生


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
FIT_XY
差別


補充其他手勢ACTION_DOWN ...


edittext



GetText .toString 取出來的值是字串
ParseInt這個方法可以將字串轉為正數
Checkbox
選擇改變觸發短暫秀特定訊息

委派函式都是同一組內容功能
所以改用另外一種方式撰寫
4個按鈕都做同一個委派函式
除了這個以上都是用匿名寫法callbackmether
重複呼叫必須用具名寫法callbackmether
下集待續
Last updated
Was this helpful?