[仿南航app開發日記5]查成績界面開發完成以及使用PopupWindow踩過的坑

前言

這篇博客是接着前一篇博客開發的:

[仿南航app開發日記4]登陸對話框完成以及自定義對話框碰到的坑

源碼

先看效果
這裏寫圖片描述
既然是寫一個界面,先上佈局文件好了:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!--整個界面的佈局-->
    <LinearLayout
        android:layout_centerInParent="true"
        android:orientation="vertical"
        android:background="@color/menuColor"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <!--頂部返回-->
        <include layout="@layout/back_layout"/>
        <!--選擇週數-->
        <LinearLayout
            android:id="@+id/score_checkWeek"
            android:layout_width="match_parent"
            android:background="@android:color/white"
            android:layout_height="45dp"
            android:gravity="center">
            <TextView
                android:id="@+id/score_week"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="2015-2016(上學期)"
                android:textSize="16sp"
                android:textColor="@android:color/black"/>
            <ImageView
                android:layout_marginLeft="5dp"
                android:layout_width="18dp"
                android:layout_height="18dp"
                android:src="@drawable/xiala"/>
        </LinearLayout>
        <View
            android:layout_width="match_parent"
            android:layout_height="1px"
            android:background="@drawable/back_line"/>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="45dp"
            android:gravity="center">
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="center"
                android:orientation="vertical">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="113.0"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="當前學分"/>
            </LinearLayout>
            <View android:layout_width="1px"
                android:layout_height="match_parent"
                android:background="@color/scoreDivideColor"/>
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="center"
                android:orientation="vertical">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="113.0"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="需要學分"/>
            </LinearLayout>
            <View android:layout_width="1px"
                android:layout_height="match_parent"
                android:background="@color/scoreDivideColor"/>
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="center"
                android:orientation="vertical">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="0.0"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="還需學分"/>
            </LinearLayout>
            <View android:layout_width="1px"
                android:layout_height="match_parent"
                android:background="@color/scoreDivideColor"/>
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="center"
                android:orientation="vertical">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="0.0"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="平均績點"/>
            </LinearLayout>

        </LinearLayout>
        <View
            android:layout_width="match_parent"
            android:layout_height="1px"
            android:background="@color/scoreDivideColor"/>
        <!--顯示成績-->
        <ListView
            android:id="@+id/score_list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:paddingLeft="15dp"
            android:paddingRight="15dp"
            android:paddingTop="10dp"
            android:dividerHeight="10dp"
            android:divider="@color/menuColor"
            android:background="@color/menuColor"
            android:scrollbarStyle="insideOverlay"
            android:scrollbars="none">
        </ListView>

    </LinearLayout>
    <!--接收事件-->
    <View
        android:id="@+id/score_cancelPopup"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerInParent="true"/>
</RelativeLayout>

這裏面有一個id叫做score_cancelPopup的View,它並沒有什麼作用,只是當popupWindow彈出的時候將它取消(我無論怎麼設置都無法讓PopupWindow消失,具體的後面講)
還有一個

<include layout="@layout/back_layout"/>

這個在:

<?xml version="1.0" encoding="utf-8"?>
<!--頂部返回的佈局,用於被其他的佈局加載-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="45dp"
    android:background="@color/backLayoutColor">
    <ImageView
        android:layout_width="40dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="-10dp"
        android:src="@drawable/back_arrow_off"/>
    <TextView
        android:layout_marginLeft="-10dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center"
        android:text="成績查詢"
        android:textColor="@android:color/white"/>
    <View
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center"
        android:text="設置"
        android:textColor="@android:color/white"
        android:layout_marginRight="10dp"
        android:visibility="invisible"/>

</LinearLayout>

這裏有我沒用使用系統自帶的下拉框,而是選擇View(Click事件)+PopupWindow來彈出自定義下拉框(後面講),先講顯示成績的那個吧,因爲這整個顯示成績的就是一個ListView,所以我爲它寫了一個Adapter:

package cn.karent.nanhang.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import cn.karent.nanhang.model.Score;
import cn.karent.nanhang.R;

/**
 * Created by wan on 2016/12/26.
 * 成績的Adapter
 */
public class ScoreAdapter extends ArrayAdapter<Score> {

    private Context mContext;

    private int mResouceId;

    public ScoreAdapter(Context context, int resourceId) {
        super(context, resourceId);
        mContext = context;
        mResouceId = resourceId;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHold hold = null;
        if( convertView == null) {
            convertView = LayoutInflater.from(mContext).inflate(mResouceId, null);
            hold = new ViewHold();
            hold.setName((TextView)convertView.findViewById(R.id.scoreItem_name));
            hold.setCourseTime((TextView)convertView.findViewById(R.id.scoreItem_courseTime));
            hold.setCoursePropety((TextView)convertView.findViewById(R.id.scoreItem_courseProperty));
            hold.setProperty((TextView)convertView.findViewById(R.id.scoreItem_property));
            hold.setWay((TextView)convertView.findViewById(R.id.scoreItem_way));
            hold.setScore((TextView)convertView.findViewById(R.id.scoreItem_score));
            hold.setCredit((TextView)convertView.findViewById(R.id.scoreItem_credit));
            convertView.setTag(hold);
        } else {
            hold = (ViewHold)convertView.getTag();
        }
        Score s = getItem(position);
        hold.getName().setText(s.getName());
        hold.getCourseTime().setText(s.getCourseTime());
        hold.getCoursePropety().setText(s.getCourseProperty());
        hold.getProperty().setText(s.getProperty());
        hold.getWay().setText(s.getWay());
        hold.getScore().setText(s.getScore() + "分");
        hold.getCredit().setText(s.getCredit() + "");
        return convertView;
    }

    class ViewHold {
        /**
         * 課時
         */
        private TextView courseTime;
        /**
         * 課程名稱
         */
        private TextView name;
        /**
         * 課程性質,比如:全校任選課
         */
        private TextView coursePropety;
        /**
         * 選修還是必修
         */
        private TextView property;
        /**
         * 考試方式
         */
        private TextView way;
        /**
         * 分數
         */
        private TextView score;
        /**
         * 學分
         */
        private TextView credit;

        public TextView getCourseTime() {
            return courseTime;
        }

        public void setCourseTime(TextView courseTime) {
            this.courseTime = courseTime;
        }

        public TextView getName() {
            return name;
        }

        public void setName(TextView name) {
            this.name = name;
        }

        public TextView getCoursePropety() {
            return coursePropety;
        }

        public void setCoursePropety(TextView coursePropety) {
            this.coursePropety = coursePropety;
        }

        public TextView getProperty() {
            return property;
        }

        public void setProperty(TextView property) {
            this.property = property;
        }

        public TextView getWay() {
            return way;
        }

        public void setWay(TextView way) {
            this.way = way;
        }

        public TextView getScore() {
            return score;
        }

        public void setScore(TextView score) {
            this.score = score;
        }

        public TextView getCredit() {
            return credit;
        }

        public void setCredit(TextView credit) {
            this.credit = credit;
        }
    }

}

那裏面有一個Score,這是一個Model,封裝了一個Item該顯示哪些數據:

package cn.karent.nanhang.model;

/**
 * Created by wan on 2016/12/26.
 * 成績的model
 */
public class Score {
    /**
     * 課程名稱
     */
    private String name;
    /**
     * 課時
     */
    private String courseTime;
    /**
     * 選修還是必修
     */
    private String property;
    /**
     * 課程性質
     */
    private String courseProperty;
    /**
     * 考試方式
     */
    private String way;
    /**
     * 分數
     */
    private float score;
    /**
     * 學分
     */
    private float credit;

    public String getCourseTime() {
        return courseTime;
    }

    public void setCourseTime(String courseTime) {
        this.courseTime = courseTime;
    }

    public String getProperty() {
        return property;
    }

    public void setProperty(String property) {
        this.property = property;
    }

    public String getWay() {
        return way;
    }

    public void setWay(String way) {
        this.way = way;
    }

    public float getScore() {
        return score;
    }

    public void setScore(float score) {
        this.score = score;
    }

    public float getCredit() {
        return credit;
    }

    public void setCredit(float credit) {
        this.credit = credit;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCourseProperty() {
        return courseProperty;
    }

    public void setCourseProperty(String courseProperty) {
        this.courseProperty = courseProperty;
    }
}

還有item的佈局:

<?xml version="1.0" encoding="utf-8"?>
<!--顯示成績的每一項-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_marginLeft="30dp"
    android:layout_marginRight="30dp"
    android:layout_marginTop="10dp"
    android:background="@drawable/score_item_shape"
    android:layout_width="wrap_content"
    android:layout_height="164dp">
    <!--標題-->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="35dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:gravity="center_vertical">
        <TextView
            android:id="@+id/scoreItem_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="大數據與社會生活"
            android:textSize="15sp"
            android:textColor="@android:color/black"/>
        <TextView
            android:id="@+id/scoreItem_courseTime"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="(總學時:20小時)"
            android:layout_marginLeft="10dp"
            android:textColor="@color/scoreTypefaceColor"/>
    </LinearLayout>
    <!--分割線-->
    <View
        android:layout_width="match_parent"
        android:layout_height="1px"
        android:background="@color/scoreDivideColor"/>
    <!--課程性質-->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:gravity="center_vertical"
        android:padding="10dp">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="課程性質:"
            android:textColor="@color/scoreTypefaceColor1"/>
        <TextView
            android:id="@+id/scoreItem_courseProperty"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:text="全校任選課"
            android:textColor="@android:color/black"/>
        <TextView
            android:id="@+id/scoreItem_property"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:text="選修"
            android:textColor="@android:color/white"
            android:background="@drawable/score_item_property_shape"/>
    </LinearLayout>
    <!--考查方式-->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="考試方式:"
            android:textColor="@color/scoreTypefaceColor1"/>
        <TextView
            android:id="@+id/scoreItem_way"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:text="考查"
            android:textColor="@android:color/black"/>
        <View
            android:layout_width="0dp"
            android:layout_height="1dp"
            android:layout_weight="1"/>
        <TextView
            android:id="@+id/scoreItem_score"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="73.0分"
            android:textColor="@color/scoreWayColor"/>
    </LinearLayout>
    <!--學分-->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="學分:"
            android:textColor="@color/scoreTypefaceColor1"/>
        <TextView
            android:id="@+id/scoreItem_credit"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:text="1.0"
            android:textColor="@color/scoreScoreColor"/>
    </LinearLayout>
</LinearLayout>

一開始我打算在LinearLayout裏面設置上、下、左、右邊距拉達到間隔的效果,但是發現無論怎麼設置都無效,默認就會填充整個ListView,幸好ListView可以設置divide屬性:

 <ListView
            android:id="@+id/score_list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:paddingLeft="15dp"
            android:paddingRight="15dp"
            android:paddingTop="10dp"
            android:dividerHeight="10dp"
            android:divider="@color/menuColor"
            android:background="@color/menuColor"
            android:scrollbarStyle="insideOverlay"
            android:scrollbars="none">
        </ListView>

我讓設置ListView的padding屬性來達到擠壓每一個Item的目的,並設置divideHeight屬性來達到兩個item之間的距離,對了,還有每一個Item有一個shape:

<?xml version="1.0" encoding="utf-8"?>
<!--每一項成績的item-->
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="10dp"/>
    <solid android:color="@android:color/white"/>
    <stroke android:width="1px" android:color="#d9d6d6"/>
</shape>

這個是設置了每一個item的背景,來達到圓角的目的,
結果如圖:
這裏寫圖片描述
接下來將自定義下拉框了,我前面說過,我這裏是使用View+PopupWindow來實現的下拉框,也就是說,上面就是一個普通的LinearLayout,然後監聽OnClick事件,在事件裏面new出一個PopupWindow來,就達到了PopupWindow的效果,先上PopupWindow的佈局:

<?xml version="1.0" encoding="utf-8"?>
<!--選擇週數的popupWindow-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="250dp"
    android:layout_height="match_parent">
    <ImageView
        android:layout_gravity="center_horizontal"
        android:layout_width="15dp"
        android:layout_height="10dp"
        android:scaleType="fitEnd"
        android:src="@drawable/upsanjiao"/>
    <ListView
        android:id="@+id/checkweek_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:divider="@null"
        android:dividerHeight="10dp"
        android:scrollbars="none"
        android:padding="10dp"
        android:background="@drawable/btn_blue_on">

    </ListView>

</LinearLayout>

在程序中使用:

public void onClick(View v) {
      if( mCheckWeekPopupWindow == null ) {
            mCheckWeekPopupWindow = new PopupWindow(this);
            View contentView = LayoutInflater.from(this).inflate(R.layout.checkweek_popup_layout, null);
            mCheckWeekPopupWindow.setContentView(contentView);
            mCheckWeekPopupWindow.setWidth(mPopupWidth);
            mCheckWeekPopupWindow.setHeight(ViewGroup.LayoutParams.MATCH_PARENT);
            mList = (ListView) contentView.findViewById(R.id.checkweek_list);
            mCheckWeekPopupWindow.setBackgroundDrawable(null);
            mCheckWeekPopupWindow.setFocusable(false);
            mCheckWeekPopupWindow.setOutsideTouchable(true);
            mList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    mCurrentYear.setText(((TextView)view).getText());
                    //讓popupWindow消失
                    mCheckWeekPopupWindow.dismiss();
                    mCheckWeekPopupWindow = null;
                }
            });
            //去除背景
            initPopupWindow();
            //計算要偏移的像素
            int offsetX = (ScreenUtil.getScreenWidth() - mPopupWidth) / 2;
            mCheckWeekPopupWindow.showAsDropDown(mCheckWeek, offsetX, 0);
        }
    }

上面的就是我說的OnClick事件了,但是有一個問題,點擊空白處不會消失,我自己想到了一個解決辦法,那就是在整個佈局裏面在添加一個充滿全屏的View。監聽它的Touch事件,但是不消費事件僅僅將PopupWindow 關掉,接下來就是一樣的使用了,因爲PopupWindow裏面也使用了ListView,它也有一個Adapter:

package cn.karent.nanhang.adapter;

import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import cn.karent.nanhang.R;

/**
 * Created by wan on 2016/12/27.
 */
public class WeekAdapter extends ArrayAdapter<String> {

    private Context mContext;

    private int mResourceId;
    /**
     * 顯示成績的Activity中顯示當前年份的TextView
     */
    private TextView mTextView;

    public WeekAdapter(Context context, int resourceId) {
        super(context, resourceId);
        mResourceId = resourceId;
        mContext = context;
    }

    public void setWeekTextView(TextView textView) {
        mTextView = textView;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if( convertView == null) {
            convertView = LayoutInflater.from(mContext).inflate(R.layout.check_week_layout, null);
        }
        TextView t = (TextView)convertView.findViewById(R.id.check_week_week);
        String s = getItem(position);
        //如果當前要加載的週數等於TextView裏面的週數,那麼改變背景色
Log.d("s:" + s, "mTextView.getText:" + mTextView.getText());
        if( s.equals(mTextView.getText())) {
Log.d("WeekAdapter", "invoked!");
            t.setBackground(new ColorDrawable(0xffffffff));
            t.setTextColor(Color.rgb(0, 0, 0));
        } else {
            t.setBackground(null);
            t.setTextColor(Color.rgb(255, 255, 255));
        }
        t.setText(s);
        return convertView;
    }
}

每一個Item的佈局:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/check_week_week"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:gravity="center"
    android:textSize="14sp"
    android:layout_marginLeft="10dp"
    android:layout_marginRight="10dp"
    android:textColor="@android:color/white">

</TextView>

因爲這是一個顯示成績的Activity,先寫一個吧:

package cn.karent.nanhang.activity;

import android.app.Activity;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;
import cn.karent.nanhang.R;
import cn.karent.nanhang.adapter.ScoreAdapter;
import cn.karent.nanhang.adapter.WeekAdapter;
import cn.karent.nanhang.model.Score;
import cn.karent.nanhang.util.ScreenUtil;

/**
 * Created by wan on 2016/12/26.
 * 顯示成績的Activity
 */
public class ScoreActivity extends Activity implements View.OnClickListener{
    /**
     * 顯示成績的列表
     */
    private ListView mScoreList;
    /**
     * 分數的Adapter
     */
    private ScoreAdapter mScoreAdapter;
    /**
     * 選擇星期的View
     */
    private View mCheckWeek;
    /**
     * 彈出框
     */
    private PopupWindow mCheckWeekPopupWindow;
    /**
     * PopupWindow的寬度
     */
    private int mPopupWidth;
    /**
     * 選擇年份的ListView
     */
    private ListView mList;
    /**
     * 用來接收所有的事件但不消費,用於消除PopupWindow無法消失的情況
     */
    private View mCancelPopup;
    /**
     * 顯示當前的年份
     */
    private TextView mCurrentYear;
    /**
     * 顯示週數的Adapter
     */
    private WeekAdapter mWeekAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.score_layout);
        mScoreList = (ListView)findViewById(R.id.score_list);
        mScoreAdapter = new ScoreAdapter(this, R.layout.score_item_layout);
        fillContent();
        mScoreList.setAdapter(mScoreAdapter);
        mCheckWeek = findViewById(R.id.score_checkWeek);
        mCheckWeek.setOnClickListener(this);
        mPopupWidth = ScreenUtil.dp2px(250);
        mCancelPopup = findViewById(R.id.score_cancelPopup);
        mCancelPopup.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if( mCheckWeekPopupWindow != null ) {
                    mCheckWeekPopupWindow.dismiss();
                    mCheckWeekPopupWindow = null;
                }
                return false;
            }
        });
        mCurrentYear = (TextView)findViewById(R.id.score_week);

    }

    /**
     * 填充測試數據
     */
    private void fillContent() {
        Score s = new Score();
        s.setName("美食與文化");
        s.setCourseTime("(總學時:20小時)");
        s.setCourseProperty("全校任選課");
        s.setProperty("選修");
        s.setWay("考查");
        s.setScore(93);
        s.setCredit(1);
        mScoreAdapter.add(s);
        mScoreAdapter.add(s);
        mScoreAdapter.add(s);
        mScoreAdapter.add(s);
        mScoreAdapter.add(s);
        mScoreAdapter.add(s);
        mScoreAdapter.add(s);
    }

    /**
     * 初始化popupWindow當中的數據
     */
    private void initPopupWindow() {
        if( mWeekAdapter != null) {
            mList.setAdapter(mWeekAdapter);
            return;
        }
        mWeekAdapter = new WeekAdapter(this, R.layout.check_week_layout);
        mWeekAdapter.setWeekTextView(mCurrentYear);
        int year = 2015;
        for(int i = 26; i > 0; i--) {
            String s = year + "-" + (year + 1);
            if( i % 2 == 0) {
                s += "(上學期)";
            } else {
                s += "(下學期)";
            }
            mWeekAdapter.add(s);
            year -= 1;
        }
        mList.setAdapter(mWeekAdapter);
    }

    /**
     * 彈出選擇週數的框
     * @param v
     */
    @Override
    public void onClick(View v) {
      if( mCheckWeekPopupWindow == null ) {
            mCheckWeekPopupWindow = new PopupWindow(this);
            View contentView = LayoutInflater.from(this).inflate(R.layout.checkweek_popup_layout, null);
            mCheckWeekPopupWindow.setContentView(contentView);
            mCheckWeekPopupWindow.setWidth(mPopupWidth);
            mCheckWeekPopupWindow.setHeight(ViewGroup.LayoutParams.MATCH_PARENT);
            mList = (ListView) contentView.findViewById(R.id.checkweek_list);
            mCheckWeekPopupWindow.setBackgroundDrawable(null);
            mCheckWeekPopupWindow.setFocusable(false);
            mCheckWeekPopupWindow.setOutsideTouchable(true);
            mList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    mCurrentYear.setText(((TextView)view).getText());
                    //讓popupWindow消失
                    mCheckWeekPopupWindow.dismiss();
                    mCheckWeekPopupWindow = null;
                }
            });
            //去除背景
            initPopupWindow();
            //計算要偏移的像素
            int offsetX = (ScreenUtil.getScreenWidth() - mPopupWidth) / 2;
            mCheckWeekPopupWindow.showAsDropDown(mCheckWeek, offsetX, 0);
        }
    }


}

原先的PopupWindow會有一個半透明的背景,如果ContentView完全填充了背景就不會顯示出來,但是我這裏最上面是一個小箭頭,旁邊就顯示,解決辦法是直接將它的背景設置爲空:

mCheckWeekPopupWindow.setBackgroundDrawable(null);

在androidMenifest.xml裏面註冊一下:

 <!--顯示成績的Activity-->
        <activity android:name=".activity.ScoreActivity">

        </activity>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章