DialogFragment使用優(yōu)化

PopupWindow、dialog怜械,DialogFragment厂汗。


比如說需求:

只攔截自身所占空間部分的事件元莫,其余空間的點擊事件不處理

可以根據(jù)改變View的布局排列方式,View是否設置底部背景及居中方式

雖然在功能上 PopupWindow 更符合需要框杜,dialog也能做到浦楣,但是使用 DialogFragment 代碼更簡潔、更方便封裝功能模塊咪辱。

基于Fragment的DialogFragment振劳,便于自定義UI,在生命周期上也優(yōu)于其他兩個油狂,性能上也是历恐。

從代碼的編寫角度看寸癌,Dialog使用起來要更為簡單

Android 官方推薦使用 DialogFragment 來代替 Dialog ,可以讓它具有更高的可復用性(降低耦合)和更好的便利性(很好的處理屏幕翻轉(zhuǎn)的情況)弱贼。

DialogFragment果然有一個非常好的特性(在手機配置變化蒸苇,導致Activity需要重新創(chuàng)建時,例如旋屏哮洽,基于DialogFragment的對話框?qū)蒄ragmentManager自動重建填渠,然而基于Dialog實現(xiàn)的對話框則沒有這樣的能力)。

創(chuàng)建:創(chuàng)建 DialogFragment 有兩種方式:

覆寫其 onCreateDialog 方法

*應用場景*:一般用于創(chuàng)建替代傳統(tǒng)的 Dialog 對話框的場景鸟辅,UI 簡單氛什,功能單一。

覆寫其 onCreateView 方法

*應用場景*:一般用于創(chuàng)建復雜內(nèi)容彈窗或全屏展示效果的場景匪凉,UI 復雜枪眉,功能復雜,一般有網(wǎng)絡請求等異步操作再层。

示例:

public class HotKeyDialogFragment extends DialogFragment implements Constants, View.OnFocusChangeListener, View.OnClickListener {

public static final String TAG? ? ? ? ? ? ? ? =HotKeyDialogFragment.class.getSimpleName();

? private View? ? ? ? ? ? mView? ? ? ? ? =null;

? private ImageView? ? ? ? mIvSearch? ? ? ? =null;

? private ImageView? ? ? ? mIvCollection? ? =null;

? private ImageView? ? ? ? mIvHistory? ? ? =null;

? private ImageView? ? ? ? mIvAbout? ? ? ? =null;

? private SimpleDraweeView? mImageView? ? ? =null;

? private int? ? ? ? ? ? ? ? mCurrentPosition? = -1;

? public static HotKeyDialogFragment newInstance() {

HotKeyDialogFragment dialog =new HotKeyDialogFragment();

? ? ? return dialog;

? }

@Override

? public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

? ? ? setStyle(DialogFragment.STYLE_NO_TITLE, R.style.Dialog);

? }

@Override

? public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

mView = inflater.inflate(R.layout.hot_key_fragment_dialog, null);

? ? ? setLocation();

? ? ? initData();

? ? ? mIvSearch =mView.findViewById(R.id.iv_search);

? ? ? mIvSearch.setFocusable(true);

? ? ? mIvSearch.requestFocus();

? ? ? if (mIvSearch.hasFocus()) {

mIvSearch.setImageResource(R.mipmap.bottom_popup_search_sel);

? ? ? }

mIvCollection =mView.findViewById(R.id.iv_collection);

? ? ? mIvHistory =mView.findViewById(R.id.iv_history);

? ? ? mIvAbout =mView.findViewById(R.id.iv_about);

? ? ? mImageView =mView.findViewById(R.id.iv_app_er_code);

? ? ? mImageView.setAspectRatio(1);

? ? ? mImageView.setImageResource(R.mipmap.er_code_image);

? ? ? setListener();

? ? ? return mView;

? }

@Override

? public void onActivityCreated(Bundle savedInstanceState) {

super.onActivityCreated(savedInstanceState);

? }

private void setListener() {

mIvSearch.setOnFocusChangeListener(this);

? ? ? mIvCollection.setOnFocusChangeListener(this);

? ? ? mIvHistory.setOnFocusChangeListener(this);

? ? ? mIvAbout.setOnFocusChangeListener(this);

? ? ? mIvSearch.setOnClickListener(this);

? ? ? mIvCollection.setOnClickListener(this);

? ? ? mIvHistory.setOnClickListener(this);

? ? ? mIvAbout.setOnClickListener(this);

? }

private void setLocation() {

Window window =getDialog().getWindow();

? ? ? window.setGravity(Gravity.CENTER_HORIZONTAL |Gravity.BOTTOM);

? ? ? window.getAttributes().windowAnimations =R.style.dialogAnim;

? }

@Override

? public void show(FragmentManager manager, String tag) {

try {

manager.beginTransaction().remove(this).commit();

? ? ? ? super.show(manager, tag);

? ? ? }catch (IllegalStateException ignore) {

}

}

@Override

? public void onFocusChange(View view, boolean hasFocus) {

switch (view.getId()) {

case R.id.iv_search:

if (hasFocus) {

mIvSearch.setImageResource(R.mipmap.bottom_popup_search_sel);

? ? ? ? ? ? }else {

mIvSearch.setImageResource(R.mipmap.bottom_popup_search);

? ? ? ? ? ? }

break;

? ? ? ? case R.id.iv_collection:

if (hasFocus) {

mIvCollection.setImageResource(R.mipmap.bottom_popup_collection_sel);

? ? ? ? ? ? }else {

mIvCollection.setImageResource(R.mipmap.bottom_popup_collection);

? ? ? ? ? ? }

break;

? ? ? ? case R.id.iv_history:

if (hasFocus) {

mIvHistory.setImageResource(R.mipmap.bottom_popup_history_sel);

? ? ? ? ? ? }else {

mIvHistory.setImageResource(R.mipmap.bottom_popup_history);

? ? ? ? ? ? }

break;

? ? ? ? case R.id.iv_about:

if (hasFocus) {

mIvAbout.setImageResource(R.mipmap.bottom_popup_about_sel);

? ? ? ? ? ? }else {

mIvAbout.setImageResource(R.mipmap.bottom_popup_about);

? ? ? ? ? ? }

break;

? ? ? ? default:

break;

? ? ? }

}

@Override

? public void onResume() {

super.onResume();

? ? ? switch (mCurrentPosition){

case 0:

mIvSearch.setFocusable(true);

? ? ? ? ? ? mIvSearch.requestFocus();

? ? ? ? ? ? if (mIvSearch.hasFocus()) {

mIvSearch.setImageResource(R.mipmap.bottom_popup_search_sel);

? ? ? ? ? ? }

break;

? ? ? ? case 1:

mIvCollection.setFocusable(true);

? ? ? ? ? ? mIvCollection.requestFocus();

? ? ? ? ? ? if (mIvCollection.hasFocus()) {

mIvCollection.setImageResource(R.mipmap.bottom_popup_collection_sel);

? ? ? ? ? ? }

break;

? ? ? ? case 2:

mIvHistory.setFocusable(true);

? ? ? ? ? ? mIvHistory.requestFocus();

? ? ? ? ? ? if (mIvHistory.hasFocus()) {

mIvHistory.setImageResource(R.mipmap.bottom_popup_history_sel);

? ? ? ? ? ? }

break;

? ? ? ? case 3:

mIvAbout.setFocusable(true);

? ? ? ? ? ? mIvAbout.requestFocus();

? ? ? ? ? ? if (mIvAbout.hasFocus()) {

mIvAbout.setImageResource(R.mipmap.bottom_popup_about_sel);

? ? ? ? ? ? }

break;

? ? ? ? default:

break;

? ? ? }

}

@Override

? public void onClick(View view) {

switch (view.getId()){

case R.id.iv_search:

mCurrentPosition=0;

? ? ? ? ? ? if (getActivity()instanceof SearchActivity) {

this.dismiss();

? ? ? ? ? ? ? return;

? ? ? ? ? ? }else {

if (getActivity()instanceof MainActivity||getActivity()instanceof BookSecondActivity){

Intent intent =new Intent(getActivity(), SearchActivity.class);

? ? ? ? ? ? ? ? ? startActivity(intent);

? ? ? ? ? ? ? }else {

getActivity().finish();

? ? ? ? ? ? ? ? ? Intent intent =new Intent(getActivity(), SearchActivity.class);

? ? ? ? ? ? ? ? ? startActivity(intent);

? ? ? ? ? ? ? }

}

break;

? ? ? ? case R.id.iv_collection:

mCurrentPosition=1;

? ? ? ? ? ? if (getActivity()instanceof CollectionActivity) {

this.dismiss();

? ? ? ? ? ? ? return;

? ? ? ? ? ? }else {

if (getActivity()instanceof MainActivity||getActivity()instanceof BookSecondActivity){

Intent intent =new Intent(getActivity(), CollectionActivity.class);

? ? ? ? ? ? ? ? ? startActivity(intent);

? ? ? ? ? ? ? }else {

getActivity().finish();

? ? ? ? ? ? ? ? ? Intent intent =new Intent(getActivity(), CollectionActivity.class);

? ? ? ? ? ? ? ? ? startActivity(intent);

? ? ? ? ? ? ? }

}

break;

? ? ? ? case R.id.iv_history:

mCurrentPosition=2;

? ? ? ? ? ? if (getActivity()instanceof HistoryActivity) {

this.dismiss();

? ? ? ? ? ? ? return;

? ? ? ? ? ? }else {

if (getActivity()instanceof MainActivity||getActivity()instanceof BookSecondActivity){

Intent intent =new Intent(getActivity(), HistoryActivity.class);

? ? ? ? ? ? ? ? ? startActivity(intent);

? ? ? ? ? ? ? }else {

getActivity().finish();

? ? ? ? ? ? ? ? ? Intent intent =new Intent(getActivity(), HistoryActivity.class);

? ? ? ? ? ? ? ? ? startActivity(intent);

? ? ? ? ? ? ? }

}

break;

? ? ? ? case R.id.iv_about:

mCurrentPosition=3;

? ? ? ? ? ? if (getActivity()instanceof AboutActivity) {

this.dismiss();

? ? ? ? ? ? ? return;

? ? ? ? ? ? }else {

if (getActivity()instanceof MainActivity||getActivity()instanceof BookSecondActivity){

Intent intent =new Intent(getActivity(), AboutActivity.class);

? ? ? ? ? ? ? ? ? startActivity(intent);

? ? ? ? ? ? ? }else {

getActivity().finish();

? ? ? ? ? ? ? ? ? Intent intent =new Intent(getActivity(), AboutActivity.class);

? ? ? ? ? ? ? ? ? startActivity(intent);

? ? ? ? ? ? ? }

}

break;

? ? ? ? default:

break;

? ? ? }

}

@Override

? public void onDestroy() {

super.onDestroy();

? }

}

以上示例是我在項目里面的一個小功能應用在TV端的贸铜,需要注意的是DialogFragment在show的時候,最好是自已重寫show方法聂受,因為DialogFrament是繼承自Fragment的蒿秦,他本身的show方法其實是調(diào)用了Fragment的commit方法,這樣在重復打開的時候容易有問題蛋济,

@Override

?? public void show(FragmentManager manager, String tag) {

try {

manager.beginTransaction().remove(this).commit();

? ? ? ?? super.show(manager, tag);

? ? ? }catch (IllegalStateException ignore) {

}

}

這樣重寫show方法每次show的時候把前一次commit移除掉棍鳖,有效的避免了重復commit引起的bug.另外還需要注意dialogFrament設置大小和位置的辦法,如果有具體的背景圖就不需要在代碼里面手動設置大小碗旅,在xml文件里面設置wrap_content就可以渡处,但是位置需要通過window手動設置,彈框動畫也是直接設置window的stytle去設置祟辟。

以上是我個人使用的一點小總結医瘫,謝謝瀏覽。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末旧困,一起剝皮案震驚了整個濱河市醇份,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吼具,老刑警劉巖被芳,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異馍悟,居然都是意外死亡畔濒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門锣咒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侵状,“玉大人赞弥,你說我怎么就攤上這事∪ば郑” “怎么了绽左?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長艇潭。 經(jīng)常有香客問我拼窥,道長,這世上最難降的妖魔是什么蹋凝? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任鲁纠,我火速辦了婚禮,結果婚禮上鳍寂,老公的妹妹穿的比我還像新娘改含。我一直安慰自己,他們只是感情好迄汛,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布捍壤。 她就那樣靜靜地躺著,像睡著了一般鞍爱。 火紅的嫁衣襯著肌膚如雪鹃觉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天睹逃,我揣著相機與錄音盗扇,去河邊找鬼。 笑死唯卖,一個胖子當著我的面吹牛粱玲,可吹牛的內(nèi)容都是我干的躬柬。 我是一名探鬼主播拜轨,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼允青!你這毒婦竟也來了橄碾?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤颠锉,失蹤者是張志新(化名)和其女友劉穎法牲,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體琼掠,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡拒垃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了瓷蛙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悼瓮。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡戈毒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出横堡,到底是詐尸還是另有隱情埋市,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布命贴,位于F島的核電站道宅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏胸蛛。R本人自食惡果不足惜污茵,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胚泌。 院中可真熱鬧省咨,春花似錦、人聲如沸玷室。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽穷缤。三九已至敌蜂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間津肛,已是汗流浹背章喉。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留身坐,地道東北人秸脱。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像部蛇,于是被迫代替她去往敵國和親摊唇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容