【问题标题】:Send data from one activity to a fragment on a second activity将数据从一个活动发送到第二个活动的片段
【发布时间】:2015-01-01 13:54:57
【问题描述】:

我有一个带有导航抽屉和几个片段的主要活动,以及一个收集一些数据的辅助活动,这些数据我存储在一个名为“端点”的字符串中。我正在尝试将辅助活动中的字符串发送到主要活动上的片段之一:

次要活动(通过意图向主要活动发送“端点”字符串):

        Intent intent = new Intent(Secondary.this,Main.class);
        intent.putExtra("endpoint",endpoint);
        startActivity(intent);

Main Activity(从Secondary Activity获取字符串):

    public void onNavigationDrawerItemSelected(int position) {
    // update the main content by replacing fragments
    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.beginTransaction()
            .replace(R.id.container, PlaceholderFragment.newInstance(position))
            .commit();
    switch (position) {
        case 0:
            Bundle args = new Bundle();
            args.putString("endpoint",getIntent().getExtras().getString("endpoint"));
            Fragment1 fragment = new Fragment1();
            fragment1.setArguments(args);
            fragmentManager.beginTransaction().replace(R.id.container, Fragment1.newInstance(position)).commit();
            break;
        case 1:
            fragmentManager.beginTransaction().replace(R.id.container, Fragment2newInstance(position)).commit();
            break;
        case 2:
            fragmentManager.beginTransaction().replace(R.id.container, Fragment3.newInstance(position)).commit();
            break;
        case 3: ...

在 Fragment 类上,我试图在 TextView 上显示数据:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    String endpoints = getActivity().getIntent().getStringExtra("endpointStr");
    View rootView = inflater.inflate(R.layout.fragment_overview, container, false);
    TextView textView = (TextView) rootView.findViewById(R.id.overviewTV);
    textView.setText(endpoint);
    return rootView;
}

这是我得到的:

E/AndroidRuntime: FATAL EXCEPTION: main 进程:com.Main.app,PID:16681 java.lang.RuntimeException:无法启动活动 ComponentInfo{com.Main.app/com.Main.app.Main}: android.view.InflateException:二进制 XML 文件第 30 行:错误 膨胀类片段 原因:android.view.InflateException: Binary XML file line #30: Error inflating class fragment 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713) 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:755) 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:758) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:492) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:397) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:353) 在 com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:343) 在 android.app.Activity.setContentView(Activity.java:1929) 在 com.Main.app.Main.onCreate(Main.java:42) 在 android.app.Activity.performCreate(Activity.java:5231) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2169) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2271) 在 android.app.ActivityThread.access$800(ActivityThread.java:144) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:136) 在 android.app.ActivityThread.main(ActivityThread.java:5146) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:515) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566) 在 dalvik.system.NativeStart.main(Native Method)

        **Caused by: java.lang.NullPointerException**
        at com.Main.app.Main.onNavigationDrawerItemSelected(Main.java:65)
        at com.Main.app.NavigationDrawerFragment.selectItem(NavigationDrawerFragment.java:205)
        at com.Main.app.NavigationDrawerFragment.onCreate(NavigationDrawerFragment.java:79)
        at android.app.Fragment.performCreate(Fragment.java:1678)
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:859)
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1040)
        at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1142)
        at android.app.Activity.onCreateView(Activity.java:4786)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:689)

           在 android.view.LayoutInflater.rInflate(LayoutInflater.java:755) 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:758) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:492) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:397) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:353) 在 com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:343) 在 android.app.Activity.setContentView(Activity.java:1929) 在 com.Main.app.Main.onCreate(Main.java:42) 在 android.app.Activity.performCreate(Activity.java:5231) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2169) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2271) 在 android.app.ActivityThread.access$800(ActivityThread.java:144) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:136) 在 android.app.ActivityThread.main(ActivityThread.java:5146) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:515) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566) 在 dalvik.system.NativeStart.main(Native Method)

如何修复它并将字符串从一个活动发送到另一个活动的片段?

这是 XML:

<!-- A DrawerLayout is intended to be used as the top-level content view using match_parent for both width and height to consume the full space available. -->
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">
    <android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ffffff"
        tools:context=".Stackerz">

        <!-- As the main content view, the view below consumes the entire
             space available using match_parent in both dimensions. -->
        <FrameLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            />

        <!-- android:layout_gravity="start" tells DrawerLayout to treat
             this as a sliding drawer on the left side for left-to-right
             languages and on the right side for right-to-left languages.
             If you're not building against API 17 or higher, use
             android:layout_gravity="left" instead. -->
        <!-- The drawer is given a fixed width in dp and extends the full height of
             the container. -->
        <fragment android:id="@+id/navigation_drawer"
            android:layout_width="@dimen/navigation_drawer_width"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:name="com.xxxxxx.app.NavigationDrawerFragment"
            tools:layout="@layout/fragment_navigation_drawer" />

    </android.support.v4.widget.DrawerLayout>
</FrameLayout>

【问题讨论】:

  • 试试这个方法:String endpoints = getArguments().getString()("endpointStr"); Fragment xml中也有问题,请发布xml代码。
  • 试过了,但没用,同样的错误。添加了 XML
  • 只要使用简单类型,您就可以像您一样简单地使用 Intents 或 SharedPreferences 来存储应该在其他活动/片段中可用的数据。如果您需要在活动或片段之间移动复杂对象,我建议查看 EventBus,请参阅此答案的编辑:stackoverflow.com/questions/26152755/…

标签: android android-intent android-activity android-fragments bundle


【解决方案1】:

好的,这就是您的 Constants 类的外观。

public class Constants {

public static Constants constants=null;

public static Constants shared(){
    if (constants==null){
        constants = new Constants();
    }
    return constants;
}

public static String endpoint;

public static String getEndpoint() {
    return endpoint;
}

public static void setEndpoint(String endpoint) {
    Constants.endpoint = endpoint;
}

}

现在,在第二个活动中,执行以下操作:

    Constants.shared().setEndpoint(endpoint);
    Intent intent = new Intent(Secondary.this,Main.class);
    startActivity(intent);

在你的 Fragment 类中,这样做:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                     Bundle savedInstanceState) {
String endpoint = Constants.shared().getEndpoint;
View rootView = inflater.inflate(R.layout.fragment_overview, container, false);
TextView textView = (TextView) rootView.findViewById(R.id.overviewTV);
textView.setText(endpoint);
return rootView;
}

【讨论】:

  • 成功了!你是冠军,谢谢!这比搞乱捆绑和接口要容易得多。我仍然没有 100% 了解活动和片段之间的通信概念。
  • 是的,我知道你的意思。当我刚开始的时候,这种方式对我来说也容易多了。但别担心,沟通概念最终会实现:)
【解决方案2】:

如果您的主要活动是将数据和工作委托给片段的中心点,我也会将信息存储在那里。 如果您的 Main 活动中有一个成员变量来存储您的端点,那么每个片段都可以通过以下方式访问它:

((Main) getActivity()).setEndpoint(endpoint)

((Main) getActivity()).getEndpoint()

这样你的主要活动就是控制器。

【讨论】:

    【解决方案3】:

    您甚至不必使用 intent.putExtra 来完成此操作。 您可以在项目中简单地引入一些静态变量。

    创建一个名为 Constants 的类。

    在那个类中,创建一个变量

    public static String endpoint;
    

    然后,在您的辅助活动中,而不是 putExtra,只需执行以下操作:

    Constants.endpoint = "your value";
    

    然后,在您的片段中简单地执行以下操作:

    TextView textView = (TextView) rootView.findViewById(R.id.overviewTV);
    textView.setText(Constants.endpoint); 
    

    【讨论】:

    • 我试过了,但 textView 显示为空白。尝试吐司,它也显示一个空的。
    • 好的,那么您的值有问题。如何生成字符串端点?
    • 它来自一个 JSON 对象,我使用 .toString 将其转换为字符串并分配给端点字符串。单击按钮后,我有一个祝酒词来测试辅助活动的内容,它可以很好地显示所有数据。我只是无法将它发送到其他活动的片段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多