2013-03-12 69 views
3

我有一個片段:吐司的onClick方法中的片段

public class FragmentSocial extends Fragment implements ActionBar.TabListener, OnClickListener 
{ 

private Fragment mFragment; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getActivity().setContentView(R.layout.fragment_social); 
} 

public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    // relevant code... 
} 

public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
    // relevant code... 
} 

public void onTabReselected(Tab tab, FragmentTransaction ft) { 
    // TODO Auto-generated method stub 

} 

public void onClick(View v) { 
    switch(v.getId()) 
    { 
    case R.id.imgBtnFB: 
     Toast.makeText(this, "FB pressed", Toast.LENGTH_LONG).show(); 
     break; 
    case R.id.imgBtnTwitter: 
     Toast.makeText(this, "Twitter pressed", Toast.LENGTH_LONG).show(); 
     break; 
    } 

} 

我在fragment_social佈局的幾個圖像按鈕。現在我只想做一個Toast消息來查看按下了哪個按鈕。但是,如果我使用this作爲上下文,我收到此錯誤消息: 類型Toast中的方法makeText(Context,CharSequence,int)不適用於參數(FragmentSocial,String,int) 我試過將this更改爲FragmentSocial.this,更改爲FragmentSocial.this.getActivity(),試圖創建private Context mContext並將其實例化爲mContext = (I tried various options here)內部的onCreate方法 - 但沒有任何效果。我要麼沒有錯誤信息,也沒有看到吐司,或者有其他錯誤。

那麼如何在這裏創建一個Toast?

謝謝!

回答

10

使用:

getActivity().getBaseContext(); 
+0

你的意思是這樣的:'Toast.makeText(getActivity()getBaseContext(), 「FB按下」 Toast.LENGTH_LONG) .show();'?試了一下,仍然沒有工作......還嘗試了'Toast.makeText(FragmentSocial.this.getActivity()。getBaseContext(),「FB pressed」,Toast.LENGTH_LONG).show();' - 沒有工作,沒有看到吐司。 – Igal 2013-03-12 14:51:15

+0

沒錯。這應該工作。將Log.d(「test」,「test」)放入onClick()中,並查看Logcat中是否有消息。那麼你會知道你的onClick()方法是否被調用。 – 2013-03-12 14:54:44

+0

Nop,我沒有看到日誌消息。猜測我在這裏做錯了什麼......我也嘗試在onCreate方法中做這樣的事情:'findViewById(R.id.imgBtnFB).setOnClickListener(this);'但我甚至沒有'findViewById '可用於某種原因的方法。 – Igal 2013-03-12 16:59:20

0

擴展馬爾辛S.答案,你也可以在設置裏面片段的構造,並通過在上下文變量。隨後,您可以在希望參考活動的任何時候使用此上下文。這種方法也稍快則getActivity().getBaseContext()

添加到您的FragmentSocial類:

Context context; 
public FragmentSocial(Context context) { 
    this.context = context; 
} 

當你曾經說FragmentSocial fragmentSocial = new FragmentSocial();在主活動類,添加放慢參數this(),使它看起來像FragmentSocial fragmentSocial = new FragmentSocial(this);

+0

您是否有過這樣的例子?也許它會工作... – Igal 2013-03-12 14:52:17

+0

@Igal檢查我修改後的答案。 – Adam 2013-03-12 14:56:01

+1

我試過了,並得到這個錯誤消息:*避免非默認構造函數在片段中:使用默認構造函數加Fragment#setArguments(Bundle)而不是*我還必須創建一個空的構造函數,因爲我有更多的錯誤(我有這個代碼在我的onTabSelected方法 - 'mFragment = new FragmentSocial();') – Igal 2013-03-12 17:09:13

0

這是這樣,我在做片段

//編輯

YourActivity activity; 


@Override 
public void onAttach(Activity activity) { 
    this.activity = (YourActivity) activity; 
} 

@Override 
public void onClick(View v) { 
    Toast.makeText(this.activity, "message", Toast.LENGTH_LONG).show(); 
} 
+0

這種方法的缺點是你正在映射片段到一個活動。所以它不能與其他活動重複使用。 – ND27 2016-03-26 17:52:55

1

以下任一行都有效。

Toast.makeText(getActivity(), "hello",Toast.LENGTH_LONG).show(); 
Toast.makeText(getActivity().getApplicationContext(),"Hello",Toast.LENGTH_LONG).show(); 
2

如果您正在使用的片段,然後使用此代碼

Toast.makeText(getActivity(), "You have insufficient points", Toast.LENGTH_LONG).show(); 
+0

這是最簡單和最簡單的解決方案。 – 2017-12-03 21:14:49