【问题标题】:Toast inside onClick method in Fragment片段中的onClick方法内的吐司
【发布时间】:2013-03-12 14:42:29
【问题描述】:

我有以下片段:

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 并在onCreate 方法中将其实例化为mContext = (I tried various options here) - 但没有任何效果。我要么没有收到错误消息,但也没有看到 Toast,或者出现其他错误。

那么我怎样才能在这里创建一个 Toast 呢?

谢谢!

【问题讨论】:

    标签: android onclick android-fragments toast


    【解决方案1】:

    使用:

    getActivity().getBaseContext();
    

    【讨论】:

    • 你的意思是这样的:Toast.makeText(getActivity().getBaseContext(), "FB pressed", Toast.LENGTH_LONG).show();?试过了,还是不行……还试过Toast.makeText(FragmentSocial.this.getActivity().getBaseContext(), "FB pressed", Toast.LENGTH_LONG).show(); - 没用,没看到Toast。
    • 正确。那应该行得通。将 Log.d("test", "test") 放入 onClick() 中,查看 Logcat 中是否有消息。你会知道你的 onClick() 方法是否被调用。
    • 不,我没有看到日志消息。猜猜我在这里做错了什么......我也尝试在 onCreate 方法中做类似的事情:findViewById(R.id.imgBtnFB).setOnClickListener(this); 但由于某种原因我什至没有可用的findViewById 方法。
    • 尝试从 onCreateView() 增加你的布局:
    • 从 onCreate 中删除所有内容(仅保留 super)并像这样创建 onCreateView():@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R. layout.fragment_social,容器,假);返回视图; }
    【解决方案2】:

    如果您使用的是片段,请使用此代码

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

    【讨论】:

    • 这是最短最简单的解决方案。
    【解决方案3】:

    以下任一行都有效。

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

    【讨论】:

      【解决方案4】:

      这是我在片段中做的方式

      //编辑

       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();
      }
      

      【讨论】:

      • 这种方法的缺点是您将片段映射到活动。所以它不能与其他活动重用。
      【解决方案5】:

      扩展 Marcin S. 的答案,您还可以在 Fragment 内设置构造函数并传入上下文变量。然后,您可以随时使用此上下文来引用活动。这个方法也比getActivity().getBaseContext()快一点

      将此添加到您的 FragmentSocial 类中:

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

      当您在主活动类中说FragmentSocial fragmentSocial = new FragmentSocial(); 时,将参数this 添加到() 中,使其看起来像FragmentSocial fragmentSocial = new FragmentSocial(this);

      【讨论】:

      • @Igal 检查我修改后的答案。
      • 我试过了,得到了这个错误信息:Avoid non-default constructors in Fragment: use a default constructor plus Fragment#setArguments(Bundle) instead 我还必须创建一个空构造函数,因为我有更多错误(我的 onTabSelected 方法中有这段代码 - mFragment = new FragmentSocial();
      猜你喜欢
      • 2015-01-04
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      • 2018-09-14
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多