Android 中片段中按钮的按钮侦听器

2024-04-07

我是 Android 新手,正在尝试自学。但我在 Fragments 方面遇到了困难。我正在创建一个简单的应用程序来学习片段。我认为这可能看起来很愚蠢,但我真的无法让它发挥作用。

我想做的就是单击 Fragment_One 中的按钮(buttonSayHi),Fragment_One 应该替换为 Fragment_Two。

我不确定何时调用片段代码以及我应该在哪里编写代码来调用第二个片段。我收到错误:无法启动活动组件。

但是,如果我放弃按钮的侦听器并且片段显示在活动中,则代码可以正常工作。

我做了相当多的研究,阅读了developer.android.com 上的fragments 教程以及Lars Vogella 的教程。我觉得我的概念还不清楚。

任何帮助将不胜感激。

以下是代码:

活动_main.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/frameLayoutFragmentContainer"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

</FrameLayout>

片段_one.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <EditText
        android:id="@+id/editTextPersonName"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName" >

        <requestFocus />
    </EditText>

    <Button
        android:id="@+id/buttonSayHi"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Say Hi" 
        android:onClick="onButtonClicked"/>

</LinearLayout>

片段_two.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textViewResult"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="I will say Hi!" />

</LinearLayout>

MainActivity.java

package com.example.fragmenttutorial;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;

public class MainActivity extends Activity{

    View view;
    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);     

        Fragment fragmentOne = new FragmentOne();

        fragmentTransaction.add(R.id.frameLayoutFragmentContainer, fragmentOne);
        fragmentTransaction.addToBackStack(null);

        fragmentTransaction.commit();
    }

    protected void onButtonClicked()
    {
        if(view.getId() == R.id.buttonSayHi){
            Fragment fragmentTwo = new FragmentTwo();

            fragmentTransaction.replace(R.id.frameLayoutFragmentContainer, fragmentTwo);
            fragmentTransaction.addToBackStack(null);

            fragmentTransaction.commit();   

        }

    }
}

FragmentOne.java

package com.example.fragmenttutorial;

import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class FragmentOne extends Fragment{

    View view;
    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

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

        View view = inflater.inflate(R.layout.fragment_one, container, false);
        return view;
    }

//  protected void onButtonClicked()
//  {
//      if(view.getId() == R.id.buttonSayHi){
//          Fragment fragmentTwo = new FragmentTwo();
//
//          fragmentTransaction.replace(R.id.frameLayoutFragmentContainer, fragmentTwo);
//          fragmentTransaction.addToBackStack(null);
//
//          fragmentTransaction.commit();   
//
//      }
//
//  }
}

我已经注释掉了片段中的点击代码。我还尝试在片段中实现 onClickListener 。

FragmentTwo.java

package com.example.fragmenttutorial;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class FragmentTwo extends Fragment{

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

        View view = inflater.inflate(R.layout.fragment_two, container, false);
        return view;    
    }
}

编辑:我已从 XML 代码中删除了 android:onClick="onButtonClicked" 行。并编辑了以下文件,但仍然不起作用。你们能给我提供一个没有 android:onClick="onButtonClicked" 行的工作示例吗?

MainActivity.java

package com.example.fragmenttutorial;

import android.os.Bundle;
import android.view.View;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;

public class MainActivity extends Activity{

    View view;
    Fragment fragmentOne;
    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);     

        fragmentOne = new FragmentOne();

        fragmentTransaction.add(R.id.frameLayoutFragmentContainer, fragmentOne);
        fragmentTransaction.addToBackStack(null);

        fragmentTransaction.commit();       
    }
}

FragmentOne.java

package com.example.fragmenttutorial;

import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;

public class FragmentOne extends Fragment implements OnClickListener{

    View view;
    Fragment fragmentTwo;
    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

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

        View view = inflater.inflate(R.layout.fragment_one, container, false);
        Button buttonSayHi = (Button) view.findViewById(R.id.buttonSayHi);
        buttonSayHi.setOnClickListener(this);
        return view;
    }

    @Override
    public void onClick(View v) {

        fragmentTwo = new FragmentTwo();

        fragmentTransaction.replace(R.id.frameLayoutFragmentContainer, fragmentTwo);
        fragmentTransaction.addToBackStack(null);

        fragmentTransaction.commit();   

    }
}

感谢您提出的宝贵建议。


您的片段类应该实现 OnClickListener

public class SmartTvControllerFragment extends Fragment implements View.OnClickListener

然后获取视图、链接按钮并设置 onClickListener,如下例所示

 View view;

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

    view = inflater.inflate(R.layout.smart_tv_controller_fragment, container, false);
    upButton = (Button) view.findViewById(R.id.smart_tv_controller_framgment_up_button);
    upButton.setOnClickListener(this);
    return view;
 }

然后添加 onClickListener 方法并执行您想要的操作。

@Override
public void onClick(View v) {
 //do what you want to do when button is clicked
    switch (v.getId()) {
        case R.id.textView_help:
            switchFragment(HelpFragment.TAG);
            break;
        case R.id.textView_settings:
            switchFragment(SettingsFragment.TAG);
            break;
    }
}

这是我的代码示例,但我希望你能理解

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 中片段中按钮的按钮侦听器 的相关文章

  • 意图?如何注册以获得传入电子邮件提醒?

    这里是极限 Android 开发新手 好吧 Android 开发新手 而不是一般开发 我想编写一个应用程序 当电子邮件进入设备时会收到通知 并根据电子邮件中的数据 主题 发件人 收件人等 采取各种操作 我认为我要做的是创建一个带有 Inte
  • 有没有办法将搜索栏添加到我的实际首选项屏幕?

    我一直看到有关添加您自己的搜索栏首选项的教程 但它不在我实际的 prefs xml 中 有什么方法可以在我的主偏好设置屏幕中添加一个 或者我必须将其分开 Google 似乎有 2 个滑块首选项 搜索栏首选项 https github com
  • 毕加索磁盘缓存

    我正在使用 Picasso 从 URL 加载图像 Picasso with getApplicationContext load product getImageUrl into imageView 据我所知 每次都会访问该网址 而不是缓存
  • BluetoothAdapter.getDefaultAdapter() 不返回 null

    这是我的第一篇文章 所以如果我做了一些愚蠢的事情 请告诉我 这个问题可能看起来与其他帖子类似 但或多或 少与我所看到的所有内容相反 关于该项目的事情 我正在开发 android 4 0 4 4 应用程序 我正在使用蓝牙 我正在运行 andr
  • Android 中的 java.util.Observable 是线程安全的吗?

    Android 中的 java util Observable 是线程安全的吗 这文档 http developer android com reference java util Observable html说只有deleteObser
  • Android 中有没有办法获取 SD 卡大小?

    欢迎大家 我已经在 Stackoverflow 和 google 上尝试过与此相关的每个问题 但没有一个有效 我已经尝试过类似下一个链接的操作 但它返回的内容与内部存储相同 如何获取外部存储 SD 卡的大小 带安装的 SD 卡 https
  • 在后台服务中持续获取位置更新

    我正在开发需要在后台服务中持续获取位置更新的应用程序 我已经使用了它正在使用的后台粘性服务 但是 即使我添加了启动广播并在那里启动了服务 启动完成后服务也没有启动 服务启动并立即被杀死 另外 这不适用于奥利奥 服务在应用程序关闭几分钟后停止
  • 如何使用 Swipe 视图实现 Android TabLayout 设计支持库

    我将使用 android TabLayout 设计支持库 但我不知道如何使用滑动视图 这是我的代码 XML
  • Android - 多次实例化一个片段?

    我正在创建一个在 ListView 中显示数据的应用程序 数据分为两种类型 热门 收藏夹 我有一个活动和两个片段 片段根据类别显示项目列表 我为此使用了 ListView 然后我有两个fragment layouts 它们在设计上完全相同
  • Android httpclient文件上传数据损坏和超时问题

    我在 Android 中上传图像时遇到问题 我正在使用 apache httpmime 4 1 lib 代码是这样的 MultipartEntity reqEntity new MultipartEntity HttpMultipartMo
  • 有没有办法在多个嵌套的 RecyclerView 之间共享同一个 LayoutManager

    我正在开发一个显示游戏列表的应用程序 在每个游戏的 itemView 内 我还有一个要显示的视频列表 预览和结构如下 我部署了一个RecyclerView作为窗口根视图 然后对于视频 我使用网格样式的RecyclerView来显示 所以这里
  • 在 android 版本 7.0 上膨胀类 android.widget.DatePicker 时出错

    我想显示弹出日期选择器并且我使用此代码 Calendar mcurrentDate Calendar getInstance int mYear mcurrentDate get Calendar YEAR int mMonth mcurr
  • 使用后退按钮启动 Activity

    我正在 Android 中开发一个应用程序 我正在寻找解决方案 有一个活动 例如 A1 通过单击按钮 用户可以转到另一个活动 例如 A2 现在 一旦用户完成 A2 活动 他就会单击后退按钮 返回到上一个活动 A1 这是众所周知的事实 A1此
  • 从Android客户端登录appengine

    我正在尝试登录应用程序引擎并访问应用程序引擎中的用户服务API 基本上我希望能够看到谁登录了我的 servlet 我正在使用从 android 获取 authtoken 然后从应用程序引擎获取 ASID 或 SACID cookie 的身份
  • 将 Crashlytics 集成到图书馆项目

    我有一个图书馆项目 自定义视图库项目 它没有任何活动 服务 我想将 Crashlytics SDK 集成到我的库中 当我尝试通过 Android Studio 的 Crashlytics 插件 工具栏中的图标 添加它时 它只是停留在 Che
  • 使用 RecyclerView.Adapter 在 onBindViewHolder() 内设置 onItemClickListener

    我有一个自定义对象 学生班 public class Student private String name private String age public String getName return name public void
  • 动态创建 JSON 对象

    我正在尝试使用以下格式创建 JSON 对象 tableID 1 price 53 payment cash quantity 3 products ID 1 quantity 1 ID 3 quantity 2 我知道如何使用 JSONOb
  • 制作弹跳动画

    我想做图层的弹跳动画 我已经完成了该图层从右到中心的操作 现在我想将其向后移动一点 然后回到中心 这会产生反弹效果 我想我可以用这样的翻译来做到这一点
  • Android Jasper 报告

    Jasper Reporting 可以集成到 Android 应用程序中吗 我正在尝试从 jrxml 文件生成 PDF CSV 文本和 XLS 报告 但是 我没有看到 Android SDK 支持 net sf jasperreports
  • Android Espresso - 如果未选中,请单击复选框

    I have onView withId R id check box perform click 但我只想在尚未选中该复选框时执行此操作 我怎样才能在浓缩咖啡中做到这一点 我还想根据其之前的状态来切换复选框 开关 起初 我尝试用此方法打开

随机推荐

  • 用python计算梯度

    我想知道如何numpy gradient工作 我用梯度来尝试计算群速度 波包的群速度是频率相对于波数的导数 而不是一组速度 我向它提供了一个 3 列数组 前 2 列是 x 和 y 坐标 第三列是该点 x y 的频率 我需要计算梯度 我确实期
  • Git 致命:远程端挂起

    所以我以为我终于在 Windows 上完成了所有设置 然后遇到了这个问题 当前设置 网址 ssh user host port myapp git 已经运行 Putty 并且可以通过 ssh authorized keys 直接使用有效的
  • Firebase 如何处理长整型和双精度型?

    Firebase Java API 指定 Long 是传递给 setValue 的有效类型 JavaScript 只支持单一数字类型 相当于 Java 的 double 因此 如果我从 JavaScript 插入一个数字并稍后从 Java
  • 我可以在应用程序运行时以编程方式翻转 Info.plist 值吗?

    我有兴趣使用SBUsesNetwork and UIRequiresPersistentWiFi我的应用程序中的密钥 但是 我想仅在使用一组特定的视图控制器时启用它们 有没有办法在应用程序运行时以编程方式翻转这些键值 您无法在运行时修改捆绑
  • Boost Python 没有 to_python for std::unique_ptr

    我有一个无法解决的 boost python 问题 我试图公开一个包含返回函数的类std unique ptr 签名看起来像 std unique ptr
  • 在 pygame 物理模拟中添加 wxPython GUI 元素

    我做了一个pygame物理模拟 抛射运动 但它缺乏交互性 比如接受发射角度 速度等 我想添加带有增加 减少箭头的输入框 但不知道如何去做 谢谢您的帮助 也许你可以尝试PGU http www pygame org project 108 菲
  • Java 无法通过 JDBC-ODBC 从 Access 检索 Unicode(立陶宛语)字母

    我有数据库 其中一些名称是用立陶宛字母写的 但是当我尝试使用 java 获取它们时 它会忽略立陶宛字母 DbConnection zadanie connect createStatement ResultSet TYPE SCROLL I
  • 如何定义和使用 Common Lisp 包(库)?

    我在几个 Lisp 源文件中开发了一些 Common Lisp 函数 我希望这些函数可以轻松地供我编写的其他函数使用 或者如果我认为它们对其他人有用的话 可以在 github 上提供 现在 我只是将它们放在一些预定义的文件夹中并使用 req
  • Excel:将两列合并为具有交替值的一列

    如何将两列数据合并为一列 如下所示 Col1 Col2 Col3 A 1 A B 2 1 C 3 B 2 C 3 您可以在列中使用以下公式D按照我的例子 请记住增加 A 1 B 6根据您的数据范围 INDEX A 1 B 6 INT ROW
  • const 值会按实例存储吗?

    对于这样的类型 public class BlurEffect public const string Name Blur public int Amount get set 我有几个成员 比如 Name 所有成员都相同 我应该将其设为静态
  • UIButton 状态的键值观察

    UIButton 有一个状态属性 所有帐户似乎都符合 KVO 并且没有文档表明其他情况 但是 当我将观察者添加到 UIButton 的状态属性时 观察者回调从未被调用 怎么会 如果你查看 UIControl 的文档 state 属性被标记为
  • CSS 无法在生产中加载 - 开发中一切正常(Rails 4.1、Capistrano 3;bootstrap),更新:nginx 配置问题

    问题如下 在开发中一切正常 但是当我将 Rails 应用程序部署到生产环境时 该网站以纯 html 格式运行 但 CSS 引导程序 未加载 JS 可能也未加载 抱歉 我花了 2 天时间寻找了大约 15 种可能的解决方案 但无法使其发挥作用
  • 在 Visual Studio 外部启动时程序运行速度较慢

    我注意到我的程序有一些奇怪的行为 我使用 Visual Studio Professional 2013 Update 1 用 C 编写它 它由一个 exe 应用程序组成 该应用程序链接多个 DLL 并调用这些 DLL 中定义的函数 在我的
  • 如何在 MySQL 中造成死锁以进行测试

    我想让我的 Python 库与 MySQLdb 一起使用 能够检测死锁并重试 我相信我已经编写了一个很好的解决方案 现在我想测试它 对于我可以使用 MySQLdb 运行来创建死锁条件的最简单查询 有什么想法吗 系统信息 MySQL 5 0
  • Ruby 中“触发器已弃用”警告的解决方法

    我从 shell 脚本中调用 Ruby 如下所示 ruby n e print if r fromre r tore 从 Ruby 2 6 开始 我收到警告 警告 触发器已被弃用 所以看来我必须做好准备 明智的 Ruby 大祭司已经决定这个
  • 跳过第一个元素之后的所有其他元素[重复]

    这个问题在这里已经有答案了 我知道如何在 Java 中做到这一点 但我正在学习 Python 不知道如何做到这一点 我需要实现一个函数 该函数返回一个列表 其中包含列表中的所有其他元素 从第一个元素开始 到目前为止 我不确定如何从这里开始
  • 为什么 C++ 中的字符数组接受非 ASCII 字符?

    所以 我希望能够在我的 C 程序中使用中文字符 并且我需要使用某种类型来保存超出 ASCII 范围的此类字符 但是 我尝试运行以下代码 并且它有效 include
  • Perl:查找数组的特定元素是否是单词或句子

    我有一个包含文本文件的数组 那么如何使用 perl 查找仅包含一个单词的数组元素 假设文件内容存储在 lines my words grep S lines Note 别忘了chomp lines 在进行任何进一步处理之前
  • CSS强制浏览器显示滚动条

    我编写了一个 Web 应用程序 发现当我调整页面大小时 浏览器不会随着窗口缩小而显示它自己的滚动条 这会阻止用户访问内容 我已将正文宽度设置为 500px 并将导航栏设置为white space nowrap 如何让浏览器识别出屏幕右侧有内
  • Android 中片段中按钮的按钮侦听器

    我是 Android 新手 正在尝试自学 但我在 Fragments 方面遇到了困难 我正在创建一个简单的应用程序来学习片段 我认为这可能看起来很愚蠢 但我真的无法让它发挥作用 我想做的就是单击 Fragment One 中的按钮 butt