Android 在应用程序之间共享视图

Android 在应用程序之间共享视图,android,layout,view,share,interactive,Android,Layout,View,Share,Interactive,首先,对不起我的英语不好。我正在开发交互式应用程序,可以从另一个应用程序更新应用程序中的视图(UI)。 您能告诉我如何将视图/布局从一个应用程序共享到另一个应用程序吗? 请提出任何建议。 谢谢 我不太明白您到底想做什么,我假设您想在点击应用程序a中的按钮后启动应用程序B,并向应用程序B提供某种信息。这样做与意图无关。我真的不知道您要发送什么样的数据,但由于数据似乎有点复杂,因此在本例中我将发送一个可序列化对象,但您几乎可以发送任何类型的数据。有关更详细的文档,请参阅Android意向指南: 首

首先,对不起我的英语不好。我正在开发交互式应用程序,可以从另一个应用程序更新应用程序中的视图(UI)。 您能告诉我如何将视图/布局从一个应用程序共享到另一个应用程序吗? 请提出任何建议。
谢谢

我不太明白您到底想做什么,我假设您想在点击应用程序a中的按钮后启动应用程序B,并向应用程序B提供某种信息。这样做与意图无关。我真的不知道您要发送什么样的数据,但由于数据似乎有点复杂,因此在本例中我将发送一个可序列化对象,但您几乎可以发送任何类型的数据。有关更详细的文档,请参阅Android意向指南:

首先,要发送的对象需要实现可序列化:

public class DataContainer implements Serializable {
     ...
}
以下是从应用程序A启动应用程序B的OnClickListener:

button.setOnClickListener(new View.OnClickListener() {

     @Override
     public void onClick(View view) {
        Context context = getApplicationContext();

        // The Object you are trying to send
        DataContainer container = getData(); 

        // Create the Intent to start the other App
        Uri webpage = Uri.parse("http://www.android.com");
        Intent intent = new Intent(Intent.ACTION_VIEW, webpage);

        // Add the object to the Intent. With the String "Data" you can later retrieve the Object in the other App
        intent.putExtra("Data", container);

        // Start the other App
        context.startActivity(intent);
     }   
});
在应用程序B的onCreate方法的主要活动中,您可以检索对象:

@Override
protected void onCreate (Bundle savedInstanceState) {

    // This means you only retrieve the data on the first start of the App, not after an orientation change etc.
    if(savedInstanceState == null) {

        // Get the Intent the App was started with.
        Intent intent = getIntent();

        // Retrieve the Object you wanted to send to this App.
        DataContainer data = (DataContainer) intent.getSerializableExtra("Data");
    }
}
在本例中,我使用字符串“Data”作为标记将对象附加到意图。永远不要在真正的应用程序中硬编码这样的字符串。您应该为此定义一个常量

编辑:

如果要发送布局,我只需发送ressource id,如下所示:

在应用程序A中:

int resId = R.layout.layout_to_send;
intent.putExtra("layout", resId);
在应用程序B中:

int resId = intent.getIntExtra("layout", -1);
...
if(resId >= 0) {
    View view = layoutInflater.inflate(resId, parent, false);
    ...
}
无论如何,我不建议这样做。如果你这样做,你会将信息发送到另一个与此应用程序无关的应用程序,而该应用程序在设计上应该相互独立。考虑一下这样的事情:

使用其他应用程序应该执行的所有可能操作创建枚举

public enum Action {
    SHOW_VIEW_A,
    SHOW_VIEW_B,
    ...
}
将其添加到应用程序A中的意图:

intent.putExtra("action", Action.SHOW_VIEW_A);
在应用程序B中,对每种可能的情况作出反应

Action action = intent.getSerializableExtra("action");

View view = null;
switch(action) {
    case SHOW_VIEW_A:
        view = layoutInflater.inflate(R.layout.view_a, parent, false);
        break;

    case SHOW_VIEW_B:
        view = layoutInflater.inflate(R.layout.view_b, parent, false);
        break;

    default:
        break;
}

if(view != null) {
    ...
}

请解释一下你的需求示例:我有两个应用程序:A和B。我点击应用程序A上的按钮,它会向B发送广播,表示B更新视图(取决于A发送B的数据)。现在我使用json进行传输,但它太长,而且不清楚。另一种方式?好的,如果我理解你的要求,你的设备上运行着应用程序a,当你点击应用程序a中的任何按钮时,你想让应用程序b启动,不是吗?因为即使你将任何东西更新到应用程序b,它在应用程序b启动之前都不会可见?谢谢你的回复。我的意思是,应用程序a向应用程序b发送数据(json、视图、任何…),和应用程序B更新视图(例如:显示1个问题和4个可选答案)以及该数据。我不想使用json。所以,你有没有什么快速的方法来传输和更新应用程序B上的视图。我编辑了我的答案,以包括关于发送布局的建议。Sr,我没有清楚地解释我的问题。我可以发送版面吗?是的,如果应用程序B已经包含版面,你只需要发送资源id。我会相应地编辑我的问题。非常感谢。我会在你的路上试一试,并告诉你结果。