从fragment到activity的接口通信问题

2024-01-03

我最近尝试使用接口进行片段活动通信。这个想法是,当在片段中按下按钮时,它会从同一片段中的 EditText 检索数据,然后将字符串发送到 MainActivty - 这控制我的所有片段 - 然后启动另一个片段并将字符串传递给这个片段片段供稍后使用,但是,我在最初设置发送数据的第一个接口时遇到了麻烦。不幸的是,没有任何反应,因此我无法到达应该显示的下一个片段。另外,我尝试过使用 getActivity() 但它无法在片段中找到关联的方法,这让我相信片段在某种程度上并没有直接连接到 MainActivity (我只掌握了 Java 的基础知识和一些 Android 的知识,刚刚学习。)

我把相关信息列出如下,感谢您的帮助!

Fragment

public class CreateWorkoutFragment extends Fragment implements OnClickListener {

View rootViewCreateWorkoutFragment;

EditText editTextWorkoutName;

// Using an ImageView for custom button
ImageView buttonNext;

String valueCreateWorkoutEditText;

OnDataPass dataPasser;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    rootViewCreateWorkoutFragment = inflater.inflate(R.layout.fragment_create_workout, container, false);

    buttonNext = (ImageView) rootViewCreateWorkoutFragment.findViewById(R.id.button_workout_name_next);

    editTextWorkoutName = (EditText) rootViewCreateWorkoutFragment.findViewById(R.id.edit_text_workout_name);

    buttonNext.setOnClickListener(this);

    return rootViewCreateWorkoutFragment;
}

public interface OnDataPass {
    public void onDataPass(String data);
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    dataPasser = (OnDataPass) activity;
}

public void passData(String data) {
    dataPasser.onDataPass(data);
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.button_workout_name_next:
            valueCreateWorkoutEditText = editTextWorkoutName.getText().toString();
            passData(valueCreateWorkoutEditText);
            break;
    }
}
}

主要活动

public class MainActivity extends FragmentActivity implements OnClickListener, CreateWorkoutFragment.OnDataPass {

ImageView buttonCreate;

Fragment newFragment;

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

    buttonCreate = (ImageView) findViewById(R.id.create_foreground);

    buttonCreate.setOnClickListener(this);

    FragmentManager fragManager = getSupportFragmentManager();
    FragmentTransaction tranManager = fragManager.beginTransaction();
    CreateWorkoutFragment createWorkoutFrag = new CreateWorkoutFragment();

    // fragment_change is just the area in XML where fragments switch
    tranManager.add(R.id.fragment_change, createWorkoutFrag);
    tranManager.commit();

    newFragment = null;
}

@Override
public void onDataPass(String data) {
    // CreateFragment is not to be confused with CreateWorkoutFragment
    // CreateFragment is the fragment I'm trying to start when any strings
    // are obtained from CreateWorkoutFragment
    newFragment = new CreateFragment();
}

@Override
public void onClick(View v) {

    switch (v.getId()) {
    // create_foreground is just an ImageView used as a button
    // Additionaly, other buttons are used to create other fragments,
    // I've cut them out currently as they are not nessesary which is
    // why CreateWorkoutFragment is only button and default currently
    case R.id.create_foreground:
        newFragment = new CreateWorkoutFragment();
        break;
    default:
        newFragment = new CreateWorkoutFragment();
    }

FragmentTransaction tranManager = getSupportFragmentManager().beginTransaction();
    tranManager.replace(R.id.fragment_change, newFragment);
    tranManager.addToBackStack(null);
    tranManager.commit();
}
}

抱歉,代码并不完全整洁,但是,它是从一个大类中删除的最相关的代码。正如我所说,我尝试了其他方法,但无论如何都无法从 MainActivity 获得任何响应。提前致谢!

就在我发帖之前:让应用程序向我写入 logcat 消息,它设法在单击按钮时传递数据 - 至少我认为,并且与片段未启动有关!在 MainActivity>onDataPass()>new Fragment = new CreateFragment() 有什么想法吗?如前所述,确实存在其他按钮并设法更改片段。但是,为了减少发布的代码量,我们进行了删减。


getActivity() 但在片段中找不到关联的方法

这是因为getActivity()返回一个Activity, not a MainActivity这是您的自定义子类。您可以通过演员轻松解决此问题。例如,在您的片段中,您可以执行以下操作:

OnDataPass main = (OnDataPass) getActivity();
main.onDataPass(message);

由于需要进行这样的强制转换,因此在我看来,该界面似乎会妨碍操作。您可以轻松地直接投射到MainActivity:

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

从fragment到activity的接口通信问题 的相关文章

  • Android-如何将 android.net.Uri 对象转换为 java.net.URI 对象?

    我正在尝试获得一个FileInputStream用户从图片库中选择的图像上的对象 这是安卓URI由返回android provider MediaStore Images Media INTERNAL CONTENT URI content
  • 使用 JSONArray 还是普通数组来存储/读取数据更有效?

    我正在使用一个连接到PHP MySQL返回所有内容的服务器JSON格式 例如 用户列表作为JSONArray of JSONObject 每个对象都包含单个用户的信息 姓名 位置 电话号码等 处理这种格式的信息时 将所有内容保留在其中会更有
  • 如何替换 Android 中已弃用的 Bundle/Argument get(key) 调用

    我有以下扩展函数 允许我在应用程序活动和片段之间传递捆绑数据项 inline fun
  • 使用 Fragment 在工具栏中实现 SearchView

    当前情况 我的应用程序主页由导航抽屉组成 因此我将视图作为片段加载 我的工具栏中也有搜索图标 我在中实现了它menu xml 下一步我实施了SearchView通过以下问题的答案来获取搜索图标在工具栏中实现搜索 https stackove
  • 当满足条件时,如何以编程方式更改 ImageButton src 目标?

    我有一个学校项目 我正在尝试开发一个手电筒应用程序 对于开 关 ImageButton 我想要 4 个自定义图像 如果手电筒关闭 turn on png 默认 turn on pressing png 按下状态 true 如果手电筒打开 t
  • 吉夫伦致命信号11

    我正在尝试使用一些本机代码来创建 Gif 我使用绘画绘制图像 创建一些笔画 单击 保存 绘制的图像将保存为 JPG 格式 当我单击 创建 Gif 时 它会获取所有图像并开始创建 gif 这是当我收到致命信号 11 并且应用程序重新启动时 我
  • Android 中的列表(特别是 RecyclerView 和 CardView)如何工作

    请原谅我问这个问题 但我是 Android 开发新手 尽管我正在尝试了解developer android com 网站上的基础知识 但大多数示例 即使他们说它们是为 Android Studio 构建的 尚未设置为使用 Gradle 因此
  • 退出设备上的 system.img

    我正在为我们部署给客户的设备 LG p509 Optimus 1 开发自动应用程序更新解决方案 我们可以控制这些设备 并且目前在它们上安装自定义内核 但不是完整的自定义 ROM 由于我们试图在设备上自动更新我们的应用程序 因此我们需要由我们
  • HMS 核心地图套件在我的 Android 应用程序上根本无法工作

    我正在尝试在我的应用程序中使用华为 HMS 地图套件 我对整体地图很陌生 无论是来自谷歌还是华为 我按照文档中的教程以及华为提供的代码实验室中的说明进行操作 并将我的代码在一起 但是当我运行地图活动时 什么也没有出现 我得到的只是一个空白活
  • Android 中 localTime 和 localDate 的替代类有哪些? [复制]

    这个问题在这里已经有答案了 我想使用从 android API 获得的长值 该值将日期返回为长值 表示为自纪元以来的毫秒数 我需要使用像 isBefore plusDays isAfter 这样的方法 Cursor managedCurso
  • Android 上的 MIDI:Java 和/或 AIR 库

    一段时间以来 我一直在考虑在 iPad 上 重新 构建一个应用程序 其中我将使用 Objective C 和DSMI http dsmi tobw net 将 MIDI 信号发送到主机 这还不错 我的意思是 除了实际编写应用程序之外 现在我
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • Android模拟器中的网络访问

    我试图通过我的 Android 应用程序访问互联网 但我既成功又失败 我在构建应用程序时启动模拟器 并且应用程序安装得很好 我可以使用浏览器访问互联网 但是 当我尝试这个小代码片段时 InetAddress inet try inet In
  • Android:GestureDetector 无法与选项卡(TabActivity、Tabwidget)一起工作(gestureDetector.onTouchEvent(event) 始终为 false)

    我已经用不同的子活动实现了 TabActivity intent new Intent setClass this MyChildTabActiviy class Initialize a TabSpec for each tab and
  • onTaskRemoved() 在华为和小米设备中没有被调用

    我一直在使用onTaskRemoved 服务中的方法 用于检测应用程序何时通过滑动从设备最近列表中删除 我执行一些日志记录和发生这种情况时需要执行的一些其他操作 它工作完美 然后我在运行Android 6 0的华为设备上检查了这个方法 该方
  • Android 标记如何实现拖放?

    你好 我正在 Android 中开发 MapView 应用程序 我有三个标记 我希望稍后能够使用 Google Map API getlocation function 为了尝试一下 我想使用拖放功能移动标记 然后检查位置 任何人都可以通过
  • 禁用 Android 菜单组

    我尝试使用以下代码禁用菜单组 但它不起作用 菜单项仍然启用 你能告诉我出了什么问题吗 资源 菜单 menu xml menu menu
  • Android-dispatchTouchEvent 给了我一个 StackOverflowError

    这里我有一个带有 setOnTouchListener 的 ViewFlipper 它工作得很好 然后我膨胀 ReLayNewsItem 然后将其添加到 ViewFlipper 现在我希望 WebView web 监听触摸事件并将它们传递给
  • 检查应用程序是否在 Android Market 上可用

    给定 Android 应用程序 ID 包名称 如何以编程方式检查该应用程序是否在 Android Market 上可用 例如 com rovio angrybirds 可用 而 com random app ibuilt 不可用 我计划从
  • 从文件路径显示图像视图?

    我需要仅使用文件名而不是资源 ID 来显示图像 ImageView imgView new ImageView this imgView setBackgroundResource R drawable img1 我在可绘制文件夹中有图像

随机推荐