15

檢索上下文我創建了一個類來檢索從一個PHP文件中的JSON編碼的意見。這個類,從的AsyncTask擴展:從片段

public class RecuperarComentarisFoto extends AsyncTask<String, String, String>{ 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     pDialog = new ProgressDialog(????); 
     pDialog.setMessage("Creating Product.."); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(true); 
     pDialog.show(); 
    } 

    @Override 
    protected String doInBackground(String... arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
    } 

} 

正如你所看到的,我想表現出ProgressDialog而「doInBackground」 proccess工作。但progressDialog的構造函數,要求一個上下文,我不知道如何提供它。

我打電話從片段這個類,所以我不能訪問的情況下是這樣的:

pDialog = new ProgressDialog(MyFragmentA.context); 

「主」胡亞蓉被稱爲:AndroidViewPagerActivity延伸FragmentActivity。

(通過主,我的意思是它是正在創建的標籤,並管理它們之間的導航的一個)

這是它的代碼:

public class AndroidViewPagerActivity extends FragmentActivity { 
ViewPager mViewPager; 
TabsAdapter mTabsAdapter; 


/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    mViewPager = new ViewPager(this); 
    mViewPager.setId(R.id.pager); 
    setContentView(mViewPager); 

    final ActionBar bar = getActionBar(); 
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_HOME); 
    bar.hide(); 

    mTabsAdapter = new TabsAdapter(this, mViewPager); 
    mTabsAdapter.addTab(bar.newTab().setText("Fragment A"), MyFragmentA.class, null); 

    if (savedInstanceState != null) { 
     bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0)); 
    } 

} 

我怎樣才能訪問上下文?我應該使用哪種上下文? 「AndroidViewPagerActivity」上下文?那麼我怎樣才能從片段中訪問它的上下文呢?

謝謝。

塞爾吉

回答

43

使用getActivity()Fragment內獲得Context,你可以傳遞下去。這工作,因爲Activity繼承Context

作爲替代方案,您可以使用getApplicationContext()來獲得Context

+0

好的,這解決了這個問題。隨着你的幫助和一些額外的谷歌,我明白了:D。打算放入我的最終代碼,因此every1可以看到實現的答案。 – Reinherd

+2

當對某些設備大規模使用時,在片段內調用getActivity()可能會導致NullPointerException。在片段被附加到活動之前進行調用時會發生這種情況。它也導致內存泄漏,這可能是致命的,很難找到。通過這個來獲得更好的理解。 https://android-developers.googleblog.com/2009/01/avoiding-memory-leaks.html –

0

FragmentActivity這會給你活動的上下文,然後你可以將它傳遞給你的AsyncTask。

1

好了,現在我知道了一些新的東西:

  • 你已經獲得從實例化片段中的類上下文。

你可以通過在代碼中包含片段(「孩子」)來做到這一點。

Context cont; 
cont=getActivity(); 

那麼,一旦你有了上下文,就可以通過它。在我的情況下,我不得不通過它一個AsyncTask類,所以我可以顯示一個對話框。

new RecuperarComentarisFoto(cont).execute(); 

而完成這一點,在「RecuperarComentarisFoto」類,我創建了一個構造函數。正如我讀過的,可以這樣做。

private Context mContext; 
public RecuperarComentarisFoto(Context context){ 
    this.mContext=context; 
} 

和魔術:

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    ProgressDialog pDialog = new ProgressDialog(this.mContext); 
    pDialog.setMessage("Creating Product.."); 
    pDialog.setIndeterminate(false); 
    pDialog.setCancelable(true); 
    pDialog.show(); 
} 

這一切都結束: enter image description here