如何寫一個Listener之二

如何寫一個Listener之二

情境

如何寫一個Listener之一當中提到
透過Listener可以跟不同的類別進行溝通
那麼如果要在Android操作又該如何使用呢?
我們假設在Activity呼叫一個Dialog, 在Dialog上進行操作
接著讓Dialog上面的數值回傳到Activity
這時候就可以使用Listener來達成我們所要的目的了。

程式碼說明

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:layout_margin="@dimen/activity_horizontal_margin"
    tools:context="com.example.givemepass.listenerdemo.MainActivity">

    <Button
        android:id="@+id/show_dialog"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="show dialog" />
    <TextView
        android:hint="result text"
        android:id="@+id/result"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

一開始在MainActivity的Layout宣告一個Button跟一個TextView,
當Button按下去, 我們就會去呼叫Dialog。

public class MainActivity extends AppCompatActivity {
    private Button showDialog;
    private TextView resultText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        showDialog = (Button) findViewById(R.id.show_dialog);
        resultText = (TextView) findViewById(R.id.result);
        showDialog.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });
    }
}

接著我們去建立一個Dialog的類別。

public class MyDialog extends Dialog{
    private EditText input;
    private Button submit;
    public MyDialog(Context context) {
        super(context, R.style.AppTheme);
        setContentView(R.layout.my_dialog);
        input = (EditText) findViewById(R.id.input);
        submit = (Button) findViewById(R.id.submit);
        submit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String inputText = input.getText().toString();
                if(inputText != null && !inputText.equals("")){

                }
                dismiss();
            }
        });
    }
}

Dialog的Layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <EditText
        android:id="@+id/input"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <Button
        android:id="@+id/submit"
        android:text="submit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

在Dialog上面放了一個輸入文字的EditText以及送出訊息的Button,
當按下Button的時候, 就透過Listener將文字回傳給Activity。
那怎麼寫這個Listener呢?

public interface OnEventCompletedListener{
   void onCompleted(String result);
}

public void setOnEventCompletedListener(OnEventCompletedListener listener){
    mOnEventCompletedListener = listener;
}
private OnEventCompletedListener mOnEventCompletedListener;

透過interface的實作, 達成callback的機制,
只要按下submit按鈕,
我們就可以利用註冊的listener物件回傳結果回去Activity。

submit.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        String inputText = input.getText().toString();
        if(inputText != null && !inputText.equals("")){
            if(mOnEventCompletedListener != null){
                mOnEventCompletedListener.onCompleted(inputText);
            }
        }
        dismiss();
    }
});

回到MainActivity,
我們補上Listener來接收傳過來的字串並且呈現在TextView上面。

showDialog.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        MyDialog mMyDialog = new MyDialog(MainActivity.this);
        mMyDialog.setOnEventCompletedListener(new MyDialog.OnEventCompletedListener() {
            @Override
            public void onCompleted(String result) {
                resultText.setText(result);
            }
        });
        mMyDialog.show();
    }
});

如此一來就可以看到兩個View透過Listener進行溝通了。






github