show code block

2017年4月10日 星期一

Android元件(Dialog) ─ 自定義Dialog(PopupView的取代方法)

前言:




上次說到PopupWindow在Android 7 以上產生的bug,這邊提供另外一種解決方式。
同場加映:http://nikeru8.blogspot.tw/2017/03/androidpopupwindowpopupview-popupwindow.html

可以使用自定義的Dialog。

這方法是使用Activity當作Dialog來使用




實作:

先來說明此次會動到的地方。

創建一個專案後。

直接開啟一個新的Activity。


這個Activity我們要拿來當作Dialog使用。
Java ActivityName取名為DialogActivity
LayoutName取名為activity_dialog

先設定背景圖片
參考:http://nikeru8.blogspot.tw/2017/03/textview.html

在drawable資料夾內創建一個背景圖片,取名為rectangle_drawable。


drawable/rectangle_drawable
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <corners
        android:topLeftRadius="5sp"
        android:topRightRadius="5sp"
        android:bottomLeftRadius="5sp"
        android:bottomRightRadius="5sp" />
    <solid android:color="@android:color/white" />
    <stroke
        android:width="2dip"
        android:color="#0290D2" />

</shape>


接下來設計一下您想要的Dialog Layout
activity_dialog.xml
activity_dialog.xml
<?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:padding="10dp"
    android:orientation="vertical"
    android:background="@drawable/rectangle_drawable">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:layout_margin="18dp"
        android:padding="5dp"
        android:text="Hello"
        android:textColor="@color/dark_text" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:layout_margin="18dp"
        android:padding="5dp"
        android:text="@android:string/ok"
        android:onClick="clickfinish" />
</LinearLayout>


DialogActivity.java 
public class DialogActivity extends Activity {//這邊請extands Activity

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 這一行是來取消TitleBar用的
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_dialog);
    }

    public void clickfinish(View view) {
        finish();
    }
}


讓畫面帶到AndroidManifest
 <activity
            android:name=".DialogActivity"
            android:theme="@android:style/Theme.Dialog"/>


讓這個Activity繼承Dialog的主題!
差不多完成囉!


接下來直接在MainActivity內連接Button接到DialogActivity就行了。
activity_main

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.chat.a015865.customdialog.MainActivity">
    //這是一個BUTTON
    <TextView
        android:onClick="onClickMe"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

MainActivity.java
public class MainActivity extends AppCompatActivity {

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

    public void onClickMe (View view) {
        Intent intent = new Intent(this, DialogActivity.class);
        startActivity(intent);
    }
}


現在跑跑看吧!
一個自定義的Dialog就完成囉!



如果要在這個自定義的Dialog內帶資料回MainActivity,直接使用Bundle 或是 startActivityForResult都行。







DEMO:
https://drive.google.com/open?id=0Byk75IYx-dKXcDdBYjJrZ2ZUTzg







沒有留言:

張貼留言

協程(coroutine) - 協程為什麼要學它?

 Coroutine 協程 再強調一次 協程就是由kotlin官方所提供的線程api //Thread Thread { }.start() //Executor val execu...