popwindows小研究

popwindows類似DIlog,但是比dilog,更容易控制位置,所以很多時候,我們會優先使用popwindows,

Android的對話框有兩種:PopupWindow和AlertDialog。它們的不同點在於:
AlertDialog的位置固定,而PopupWindow的位置可以隨意
AlertDialog是非阻塞線程的,而PopupWindow是阻塞線程的
PopupWindow的位置按照有無偏移分,可以分爲偏移和無偏移兩種;按照參照物的不同,可以分爲相對於某個控件(Anchor錨)和相對於父控件。具體如下

showAsDropDown(View anchor):相對某個控件的位置(正左下方),無偏移
showAsDropDown(View anchor, int xoff, int yoff):相對某個控件的位置,有偏移
showAtLocation(View parent, int gravity, int x, int y):相對於父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以設置偏移或無偏移

然後寫了個小demo,記錄一下

首先看一下效果圖,hello worid作爲錨點(也就是父控件)


代碼很簡單,我直接寫在註釋裏面

這是mainactivity

package com.anlaiye.swt.selectcity;

import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.PopupWindow;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button topbutton;
    private Button bottombutton;
    private Button controlbutton;
    private TextView textView;//已這個view作爲指定的view
    private PopupWindow mPopupWindow;
    private View typeview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        topbutton = (Button) findViewById(R.id.top);
        bottombutton = (Button) findViewById(R.id.bottom);
        controlbutton = (Button) findViewById(R.id.control);
        textView = (TextView) findViewById(R.id.text);
        topbutton.setOnClickListener(this);
        bottombutton.setOnClickListener(this);
        controlbutton.setOnClickListener(this);
        typeview = LayoutInflater.from(getApplicationContext()).inflate(R.layout.pop, null);//實例化一個view給popwindows用
        mPopupWindow = new PopupWindow(typeview, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);//設置popwindows的內容view,它的寬度,高度,
        mPopupWindow.setTouchable(true);//可以觸摸
        mPopupWindow.setOutsideTouchable(true);//設置popwindow如果點擊外面區域,便關閉。
        mPopupWindow.getContentView().setFocusableInTouchMode(true);//允許使用鍵盤模式
        mPopupWindow.getContentView().setFocusable(true);//獲取popwindow焦點
        mPopupWindow.setBackgroundDrawable(new BitmapDrawable(getResources(), (Bitmap) null));//這句加上之後,點擊背景才能去掉popwindows
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.top:
                mPopupWindow.showAtLocation(textView, Gravity.TOP, 0, 250);    //設置popwindow顯示位置
                break;
            case R.id.bottom:
                mPopupWindow.showAsDropDown(textView);
                break;
            case R.id.control:
                mPopupWindow.showAsDropDown(textView, 0, -50);
                break;
        }
    }
}





這是佈局文件

<?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:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.anlaiye.swt.selectcity.MainActivity">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="right"
        android:orientation="vertical">

        <Button
            android:id="@+id/top"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="向上打開" />

        <Button
            android:id="@+id/bottom"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="向下打開" />

        <Button
            android:id="@+id/control"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="指定控件" />
    </LinearLayout>

    <TextView
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="Hello World!" />
</LinearLayout>

這是popwindows的佈局文件

<?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="wrap_content"
    android:orientation="vertical"
    tools:background="@color/blue">

    <ImageView
        android:layout_width="21dp"
        android:layout_height="7dp"
        android:layout_gravity="right"
        android:layout_marginRight="35dp"
        android:src="@drawable/pop_up"
        tools:layout_marginTop="8.9dp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="25dp"
        android:layout_marginRight="25dp"
        android:background="@color/white"
        android:orientation="horizontal"
        android:paddingBottom="13dp"
        android:paddingRight="16dp"
        android:paddingTop="13dp">


        <ImageView
            android:layout_width="19dp"
            android:layout_height="20dp"
            android:layout_marginLeft="17dp"
            android:src="@drawable/notice" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="8.9dp"
            android:text="我是通知,年底搶票,我是通知,年底搶票咯咯~~~~~~~"
            android:textColor="#FF333333"
            android:textSize="13sp" />
    </LinearLayout>

</LinearLayout>

大致代碼就是這樣,用起來還是很方便的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章