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