在应用之间共享视图

时间:2013-11-04 03:05:29

标签: android layout view share interactive

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

1 个答案:

答案 0 :(得分:0)

我不明白你想要做什么,我假设您想要在点击App A中的Button后启动App B,并为App B提供某种信息。这样做对Intents来说没有问题。我真的不知道你要发送什么样的数据,但由于看起来数据有点复杂,我将在这个例子中发送一个可序列化的对象,但你可以发送几乎任何类型的数据。有关更详细的文档,请参阅Android Intents on Intents: http://developer.android.com/reference/android/content/Intent.html

首先,您要发送的对象需要实现Serializable:

public class DataContainer implements Serializable {
     ...
}

这是来自App A的OnClickListener,它启动了App B:

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);
     }   
});

在AppB的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");
    }
}

在这个例子中,我使用String“Data”作为标记将对象附加到Intent。永远不要在真实的应用程序中像这样硬编码字符串。你应该为此目的定义一个常量。

修改

如果您想发送布局,我只需发送资源ID,如下所示:

在App A中:

int resId = R.layout.layout_to_send;
intent.putExtra("layout", resId);

在App 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,
    ...
}

将其添加到App A中的意图:

intent.putExtra("action", Action.SHOW_VIEW_A);

在App 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) {
    ...
}