【问题标题】:How to display a toast message on clicking a button in a fragment?如何在单击片段中的按钮时显示吐司消息?
【发布时间】:2016-07-28 08:28:13
【问题描述】:

首先,如果这是一个愚蠢的问题,请原谅我,因为我在这个领域相对较新。 所以基本上,我有一个包含片段的activity。这个片段有三个按钮。当点击任何一个按钮时,我想显示特定的Toast messages。我使用了onClick() 方法,该方法在活动中运行良好。但是当我在片段中使用它时,应用程序崩溃了。请在这方面帮助我。活动的名称是“User.java”,它的 XML 文件是“activity_user.xml”。片段名称“user_home.java”,其 xml 文件为“user_home_layout.xml”。
我附上了两张图片,第一张包含活动及其 XML 文件,第二张包含片段及其 sml 文件。

1.Activity2.Fragment

【问题讨论】:

  • 你能发布你的应用程序崩溃的堆栈跟踪吗?
  • 崩溃的可能原因至少有两个。 1)buttonInFragment = (Button) view.findViewById(R.id.buttonInFragment);buttonInActivity = (Button) findViewById(R.id.buttonActivity);Toast.makeText(MainActivity.this, "Toast for activity", Toast.Length_Short).show()Toast.makeText(getActivity(), "Toast for Fragment", Toast.Length_Short).show()
  • @NitroNbg:这是我得到的错误:'java.lang.IllegalStateException:在视图类android上定义的onClick属性的父或祖先上下文中找不到方法ButtonClick(View) .support.v7.widget.AppCompatButton,ID 为“GOT”

标签: android android-fragments android-toast


【解决方案1】:

您可以在片段中找到按钮,

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.user_home_layout, container, false);

    btn1=(Button)view.findViewById(R.id.GOT);  
    btn2=(Button)view.findViewById(R.id.SH);  
    btn3=(Button)view.findViewById(R.id.TD);

return view;
}

然后实现点击监听并在 Toast 中使用 getActivity()

Toast.makeText(getActivity(), "Game Of Thrones", Toast.LENGTH_SHORT).show();

实现方法

public void ButtonClick(View v) {
switch(v.getId()) {

 case R.id.GOT:


  Toast.makeText(getActivity(), "Game of Thornes", Toast.LENGTH_LONG).show();

   break;


 case R.id.SH:


  Toast.makeText(getActivity(), "Sherlock", Toast.LENGTH_LONG).show();

   break;


 case R.id.TD:


  Toast.makeText(getActivity(), "True Detective", Toast.LENGTH_LONG).show();

   break;
   }
 }    

【讨论】:

    【解决方案2】:

    你需要为你的按钮设置一个自定义的 OnClickListener :

    yourButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(getActivity(), "your toast text", Toast.LENGTH_LONG).show();
                }
            });
    

    【讨论】:

      【解决方案3】:

      在你的活动中:

      Toast.makeText(YourActivity.this, "your message", Toast.LENGTH_SHORT).show();
      

      在你的片段中:

      Toast.makeText(this.getActivity(), "your message", Toast.LENGTH_SHORT).show();
      

      【讨论】:

      • 更改使用的上下文不会解决用户问题
      【解决方案4】:

      @TonyMathew,欢迎来到 Android 世界。您对 ButtonClick 的实现是错误的。 This 是关于如何使用 Fragments 的详尽教程。还有一个处理点击事件的例子。长话短说,您需要通过 id 在片段 xml 布局中找到按钮。 不要使用按钮的文字!

      请先在网上搜索信息,然后再在此处发布问题。您很有可能会找到您要找的东西!

      附: 通常在 Java 中你应该用以下方式命名你的类:ClassName.java 而不是 class_name.java

      【讨论】:

      • 我要指出的第一件事是这个答案绝对应该是一个评论,第二个是通过名称找到按钮没有问题。
      • @Todor Kostov:事实上,我对处理按钮点击感到非常困惑。
      • @lulian Popescu,首先,答案不应该是评论,因为它提供了有关问题的有用信息,其次 - 使用标签时存在一个大问题 a按钮进行识别。当您尝试本地化您的应用程序时会发生什么?如果您有以下“继续”(英语)和“Продължи”(保加利亚语翻译)作为同一个按钮的文本,那么您的逻辑将不起作用!
      • 对此很抱歉,但我只是看不到任何有用的问题信息(你所说的一切都是 URL 的实现错误,应该教你如何修复该代码) , 可能在评论中的东西。关于按钮的识别,我同意在本地化的情况下可能会出现一些问题,但如果字符串是从strings.xml 加载的并且不是在文本中硬编码,它们很容易修复。
      • @lulian Popescu,从 strings.xml 加载字符串听起来像是一个可能的解决方案,只要您没有两个或更多具有相同文本的按钮。 ID 是唯一的,因此最好使用它们。
      【解决方案5】:

      只需将 getActivity() 放在 makeText() 的上下文中,如下所示:

      Toast.makeText(getActivity(), "Your message", Toast.LENGTH_SHORT).show();
      

      【讨论】:

      • 使用getActivity只会改变使用的上下文,不能解决问题
      【解决方案6】:

      问题是在活动中找不到您的方法,因此引发了异常(此处不包括来自片段的方法)。要解决这个问题,您有 2 个选项:

      1. 在活动中移动ButtonClick方法并做一些小改动(你必须以不同的方式获得Context)并保持xml文件不变;
      2. 为按钮设置onClickListener,并在监听器内部处理onClick事件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-29
        • 2018-07-22
        • 1970-01-01
        • 2021-07-30
        • 1970-01-01
        相关资源
        最近更新 更多