【问题标题】:In android, how do I pass information from one activity (Dialog) to another?在android中,如何将信息从一个活动(对话框)传递到另一个?
【发布时间】:2014-01-27 03:19:19
【问题描述】:

我有一个对话框,它会打开显示所有可启动的已安装应用程序。我将它们显示在网格视图中,并在 GridItemClick 时启动活动。

我怎样才能做到这一点,而不是启动关联的应用程序,而是将它们从我的自定义对话框添加到包含启动对话框的按钮的片段以及应用程序名称?也就是创建另一个应用程序的快捷方式。

我认为相关的是我的 ItemClick:

    @Override
public void onGridItemClick(GridView g, View v, int position, long id) {
    AppModel app = (AppModel) getGridAdapter().getItem(position);
    if (app != null) {
        Intent intent = getActivity().getPackageManager()
                .getLaunchIntentForPackage(app.getApplicationPackageName());

        if (intent != null) {
            startActivity(intent);
        }
    }
}

另外,我如何才能让应用记住添加的内容?我不希望用户必须重新添加上次启动应用程序时添加的任何内容。

【问题讨论】:

    标签: android android-activity shortcut


    【解决方案1】:

    由于您使用的是调用对话框的单个活动,因此此解决方案可能有效。

    为活动中所选应用的创建静态变量,并为应用名称再创建一个:

    public static string app_pkg = null;
    public static string app_name = null;
    

    在您的活动中创建一个按钮,用于显示所选应用的文本,并在用户单击该按钮时启动它。以相同的方式使您的应用按钮单击静态。最初,隐藏该按钮不可见。

    然后使用,

       @Override
    public void onGridItemClick(GridView g, View v, int position, long id) {
    AppModel app = (AppModel) getGridAdapter().getItem(position); 
     if (app != null) {
    
      ActivityName.app_pkg = app.getApplicationPackageName().toString();
      ActivityName.app_name = app.getApplicationName().toString(); //not sure about this statement for the class AppModel ( it will be something similar to this, just check 
      ActivityName.button_name.setText(ActivityName.app_name); //Set the button with selected app name here
      // unhide your button here
       //dismiss your grid here
    }  
    
       }
    }
    

    在您的活动中,在该按钮的 onClick 方法中,启动意图

    submit.setOnClickListener(new View.OnClickListener() {
    
            @Override
            public void onClick(View v) {
     if (!app_pkg.equals(null)) {
        Intent lock = new Intent(getActivity(),app_pkg);
    
        if (intent != null) {
            startActivity(intent);
        }
    }
    
     }
    
        });
    

    注意:当您有多个活动时,这是不可取的,因为静态变量可能会导致内存泄漏,因为它们不会被垃圾收集器正常收集,并且活动时可能会出现异常该静态变量所属的被销毁。

    但是由于您有一个非常简单的流程并且只有三个这样的变量,因此应该可以正常工作。

    【讨论】:

    • 我觉得我非常感谢你愿意帮助我了解这件事。如果我理解正确, app_pkg 将应用程序名称存储为字符串,然后将按钮上的文本设置为应用程序名称。正确的? onClick 后,它将启动所述应用程序。我当时面临的问题是它仍然只是一个按钮。我想用用户在新网格视图中添加的尽可能多的应用程序填充我的片段。正确的简单性。一个带有多个动态片段的 FragmentActivity,带有自定义 onClick 方法,可从 Fragment -> Activity 进行交互。
    • app_pkg 将存储应用的包名,而不是app-name。包名称在同一应用程序的不同版本中更加一致,因此如果您想使用长时间不变的参数,包名称很适合。我正在编辑我的答案。您可以类似地获取应用程序名称本身来设置按钮名称。但是您仍然需要应用程序的 包名称 才能通过意图启动它。
    • 所以你是说假设用户在gridview中点击了多个选项,它应该在你的活动中作为单独的按钮弹出?
    • 最好,但这不是必须的。只是一个方便的东西。正如我在您之前在 cmets 中的回答中所说,它的行为应该就像启动器创建快捷方式一样。例如 Apex Launcher,您按住以获取一个显示列表视图的对话框,其中一个是“快捷方式”。按下它,它会启动一个新的活动,为您提供已安装应用程序的列表。选择一个,它会添加到您的主屏幕。我已经向 Vogella.com 团队发送了关于他们的 SQLite 示例的电子邮件,但他们确实警告说他们没有时间帮助解决这些问题。
    • 这只是没有很好的记录。我认为大多数创建发射器的开发人员(有很多!)从其他人那里窃取他们的工作(即 CyanogenMod 的 Trebuchet 发射器)。这伤害了像我这样想要使用启动器执行的功能的新开发人员。如果这个问题得到解决,我希望这可以帮助其他寻找同样问题的初学者。
    猜你喜欢
    • 2018-01-13
    • 2018-10-10
    • 2011-02-13
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    相关资源
    最近更新 更多