2013-03-12 63 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