1. 程式人生 > >【Android開發技巧】Fragment中獲取Context物件的兩種方法

【Android開發技巧】Fragment中獲取Context物件的兩種方法

我們在使用Fragment的時候經常需要傳遞Context型別的引數,【Android用的比較多的就是下面幾個導航按鈕,點選切換fragment(之前Android studio2.0以前是可以new fragment(context)時傳遞Context,但後來升級了studio2.1.2之後,new fragment物件時傳遞context會報錯,不得不想別的法子了)】而Fragment自己又不是一個Context型別的物件,於是我們有下面兩種方法獲取Context物件。

一、兩種方法介紹

1.this.getActivity()(可以不寫this.)
在Fragment中直接呼叫getActivity()方法,可以直接得到Fragment依附的Activity,而Activity是一個Context型別的物件。

2.獲取Application物件
如下自己寫一個MyApplication類繼承Application,通過getInstance獲取一個Application型別的物件,也是Context物件。
public class MyApplication extends Application {
    private static MyApplication mInstance;/**
     * 獲取context     * @return
*/
public static Context getInstance() {
        if (mInstance == null) {
            mInstance 
= new MyApplication(); } return mInstance; } }

二、兩種方法比較

1.this.getActivity()

  • 優點:不需要寫MyApplication類
  • 缺點:Fragment很容易被銷燬,呼叫getActivity()方法會報空指標錯誤(注意:並不是getActivity()返回值為null,而是this.getActivity()中的this,也就是Fragment自己是null,因為它已經被銷燬了)

2.獲取Application物件

  • 優點:不會遇到類似this.getActivity()的空指標問題
  • 缺點:某些情況下的Context
    必須是Activity,特別是例項化Dialog等需要依附於一個Activity的視覺化的物件時傳參必須是Activity物件(Toast是Android的一種通知機制,不需要依附於Activity

三、兩全其美的解決方案

1.MyApplication是一定要寫的
2.寫一個如下的BaseFragment類
:所有的Fragment都繼承這個BaseFragment,直接通過getContext()方法即可得到Context物件,當然例項化Dialog等需要依附於Activity的物件時,還是老老實實的getActivity()

public class BaseFragment extends Fragment {
    private Activity activity;
    public Context getContext() {
        if (activity == null) {
            return MyApplication.getInstance();
}
        return activity;
}

    @Override
public void onAttach(Context context) {
        super.onAttach(context);
activity = getActivity();
}
}

相關推薦

Android開發技巧Fragment獲取Context物件方法

我們在使用Fragment的時候經常需要傳遞Context型別的引數,【Android用的比較多的就是下面幾個導航按鈕,點選切換fragment(之前Android studio2.0以前是可以new fragment(context)時傳遞Context,但後來升級了studio2.1.2之後,new

Android開發技巧Android7.0新簽名對多渠道打包的影響

老簽名多渠道打包原理 前言 由於Android7.0釋出了新的簽名機制,加強了簽名的加固,導致在新的簽名機制下無法通過美團式的方式再繼續打多渠道包了。不過在說新的簽名機制對打包方案的 影響和為什麼會影響我們原有的打包機制之前,需要先簡單理解下打包原理和簽名

Qt開發Qt顯示影象的方法對比

在Qt中處理圖片一般都要用到QImage類,但是QImage的物件不能夠直接顯示出來,要想能看到圖片,初步發現有兩種方法。 一、QImage轉QPixmap,然後用QLabel::setPixmap() image=new QImage("D:/Temp/XX.jpg

Spring獲取bean的方法

第一種採用註解方法 註解的方法比較簡單,不在進行詳細介紹,這邊主要將的是另外一種方法,當通過註解獲取不到bean時,可以採用根據上下文獲取。 第二種上下文獲取bean @Component public class SpringBeanUtil implements Appli

python獲取cookie的方法

第一種是利用selenium+phantomjs無介面瀏覽器的形式訪問網站,再獲取cookie值:# 匯入模組 from selenium import webdriver driver=webdri

Android開發-5界面裝修,五大布局你選誰

比例 技術分享 article 嵌套 content java lin layout mark 前言:假設要開一家店,門店裝修是非常重要的事情。有錢都請專門的建築設計公司來設計裝修,沒錢的僅僅能自己瞎折騰。好不好看全憑自己的感覺。像Android開發。在移動端大家看到的

python獲取python版本號的方法

n) https href light nor body true print brush 原文 python3 #!/usr/bin/python # 第1種方法 import platform print(platform.python_version())

C# 開發技巧如何防止程序多次運行

false name classname 發現 mic RR www. nvi lib 一、引言 最近發現很多人在論壇中問到如何防止程序被多次運行的問題的,如: http://social.msdn.microsoft.com/Forums/zh-CN/6398fb10-e

Android開發經驗android:windowSoftInputMode屬性具體解釋

中一 mtk wid water ren 而是 orien 表示 不能 本文章來自CSDN博客:http://blog.csdn.net/zhaokaiqiang1992。轉載請註明地址! 在前面的一篇文章中,簡單的介紹了一下怎樣實現軟鍵盤不自己主動彈出,使

C# 開發技巧 Application.DoEvents( ) 使用筆記

該方法可以處理當前佇列的訊息,比如一個for迴圈 5000次 向TextBox中追加文字,那肯定會假死一會兒的。 此時便可使用Application.DoEvents()來處理佇列的資訊。   簡單說下使用Application.DoEvents() 和 不使用Application.DoEv

android開發筆記如何讓ImageButton去掉白色邊框和讓ImageButton具有點選效果

這是我從網上學來的,怕忘記,遂記起來 如何讓ImageButton去掉白色邊框 android:background="#00000000" //把背景變透明放在那一段程式碼裡呢?放在layout裡面的.xml檔案裡 如: <ImageButton a

Android開發日記Popupwindow 完美demo

Popupwindow 完美demo實現 圖示:                                                                                                       關鍵程式碼說明:

Android開發技巧——去掉TextViewautolink的下劃線

我們知道,在佈局檔案中設定textview的autolink及其型別,這時textivew上會顯示link的顏色,並且文字下面會有一條下劃線,表示可以點選。而在我們在點選textview時,應用將根據我們所設定的型別跳轉到對應的介面。但是有時,我們因介面需求,需要去掉介面上

Android 開發入門android studio 控制檯列印輸出日誌

有些情況下,不方便使用斷點的方式來除錯,而是希望在控制檯列印輸出日誌,使用過Eclipse的同學都知道Java可以使用 System.out.println(""); 來在控制檯列印輸出日誌,但是在android studio中卻是不行的,還是有差別的,那應該用什麼呢?and

Android開發bugDropping event due to no window focus

問題描述: 使用android自帶視訊播放器播放視訊,按返回鍵不能退出這個介面(Android_4.4.4系統); Log如下: 11-25 16:37:31.498: W/ViewRootImpl(27708): Dropping event due to no win

Android 開發入門使用Android模擬器預覽除錯程式

在上篇“走進Android開發的世界,HelloWorld”,我們建立了一個Android 專案 HelloWorld,並演示瞭如何通過USB連線手機檢視執行效果;而如果沒有手機或沒有對應型號的手機,又

Android開發經驗APP的快取檔案到底應該存在哪?看完這篇文章你應該就自己清楚了

只要是需要進行聯網獲取資料的APP,那麼不管是版本更新,還是圖片快取,都會在本地產生快取檔案。那麼,這些快取檔案到底放在什地方合適呢?系統有沒有給我們提供建議的快取位置呢?不同的快取位置有什麼不同呢?今天這篇文章就是主要來說明這個問題的。     首先,我們要知道,在A

Android 開發入門我為什麼要在Android找工作越來越難的時候開始學習它

首先,Android是不是真的找工作越來越難呢?這個可能是大家最關心的。這個受大的經濟環境以及行業發展前景的影響,同時也和個人因素有關。2016-08-26近期一方面是所在的公司招聘Java開發人員很難招到合適的,投簡歷的人很少;而另一方面,經常聽身邊的人說Android、i

Android開發經驗LayoutInflater——80%的Android程式設計師對它並不瞭解甚至錯誤使用

這個標題起的有點誇張哈,但是LayoutInflater這個類的一些用法,在Android開發者使用的過程中,確實存在著一些很普遍的誤區,最起碼我研究的這麼多小專案的原始碼,基本上都在錯誤的使用這個類。今天,看到了一篇文章講LayoutInflater的用法,瞬間感覺自己對

Android開發,在Fragment,隱藏或關閉軟鍵盤(虛擬鍵盤)的方法

網上可以搜到各種方法,實際測試中,我的開發用機中,僅僅下面這個方法有效,記錄一下。   //隱藏虛擬鍵盤      public static void HideKeyboard(View v)