【问题标题】:Android Master detail template - how to transfer variable from master list item to detail fragment?Android 主详细信息模板 - 如何将变量从主列表项传输到详细信息片段?
【发布时间】:2014-02-03 22:06:20
【问题描述】:

我正在使用主从流模板通过 SAP 移动平台显示来自 SAP 的三个表。从仅是工作订单标题列表的第一个活动中,我选择一个标题(工作订单)并显示主活动(ItemListActivity)中的项目列表。我可以这样做,但是现在当我单击项目时,我必须转发一个长变量(surrogateKey),以便我可以加载该项目的详细信息以及关于详细活动的另外两个列表。我做了布局,但是当我运行它时,它会在 ItemDetailFragment 的 onCreateView 中引发 nullPointerException 错误。 这是来自 ItemListFragment :

    @Override
public void onListItemClick(ListView listView, View view, int position,
        long id) {
    super.onListItemClick(listView, view, position, id);

    Item item = items.get(position);
    long surrogateKey = item.getSurrogateKey();

    // Notify the active callbacks interface (the activity, if the
    // fragment is attached to one) that an item has been selected.
    mCallbacks.onItemSelected(surrogateKey);

}

这是来自 ItemListActivity :

    @Override
public void onItemSelected(Long surrogateKey) {
    if (mTwoPane) {
        // In two-pane mode, show the detail view in this activity by
        // adding or replacing the detail fragment using a
        // fragment transaction.
        Bundle arguments = new Bundle();
        arguments.putLong(ItemDetailFragment.ARG_ITEM_ID, surrogateKey);
        ItemDetailFragment fragment = new ItemDetailFragment();
        fragment.setArguments(arguments);
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.item_detail_container, fragment).commit();

    } else {
        // In single-pane mode, simply start the detail activity
        // for the selected item ID.
        Intent detailIntent = new Intent(ItemListActivity.this, ItemDetailActivity.class);
        detailIntent.putExtra("surrogateKey", surrogateKey);
        startActivity(detailIntent);
    }
}

这是来自 ItemDetailActivity :

        // Create the detail fragment and add it to the activity
        // using a fragment transaction.
        Bundle arguments = new Bundle();
        arguments.getLong(ItemDetailFragment.ARG_ITEM_ID, 0);
        ItemDetailFragment fragment = new ItemDetailFragment();
        fragment.setArguments(arguments);
        getSupportFragmentManager().beginTransaction()
                .add(R.id.item_detail_container, fragment).commit();

并且在ItemDetailFragment的onCreate中:

    surrogateKeyItem = getArguments().getLong(ARG_ITEM_ID);

具有正确的值(来自调试),但在 onCreateView 中它在 setText 上中断:

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

    Item item = Item.find(surrogateKeyItem);

    final EditText psmc = (EditText)this.getActivity().findViewById(R.id.editPsmc);
    psmc.setText(item.getPOCETNOSMC().toString());

我做错了什么?

这是来自 LogCat:

02-03 23:33:41.889: D/AndroidRuntime(22361): 关闭 VM 02-03 23:33:41.889: W/dalvikvm(22361): threadid=1: 线程退出未捕获异常 (group= 0x415622a0) 02-03 23:33:41.944: E/AndroidRuntime(22361): 致命异常: main 02-03 23:33:41.944: E/AndroidRuntime(22361): java.lang.NullPointerException 02-03 23:33: 41.944: E/AndroidRuntime(22361): 在 andrzg.zaga.app.md.ItemDetailFragment.onCreateView(ItemDetailFragment.java:97) 02-03 23:33:41.944: E/AndroidRuntime(22361): 在 android.support.v4 .app.Fragment.performCreateView(Fragment.java:1500) 02-03 23:33:41.944: E/AndroidRuntime(22361): 在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927) 02- 03 23:33:41.944: E/AndroidRuntime(22361): 在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) 02-03 23:33:41.944: E/AndroidRuntime(22361): 在android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 02-03 23:33:41.944: E/AndroidRuntime(22361): 在 android.suppor t.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467) 02-03 23:33:41.944: E/AndroidRuntime(22361): 在 android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java: 440) 02-03 23:33:41.944: E/AndroidRuntime(22361): 在 android.os.Handler.handleCallback(Handler.java:615) 02-03 23:33:41.944: E/AndroidRuntime(22361): 在android.os.Handler.dispatchMessage(Handler.java:92) 02-03 23:33:41.944: E/AndroidRuntime(22361): 在 android.os.Looper.loop(Looper.java:137) 02-03 23: 33:41.944: E/AndroidRuntime(22361): 在 android.app.ActivityThread.main(ActivityThread.java:4895) 02-03 23:33:41.944: E/AndroidRuntime(22361): 在 java.lang.reflect.Method .invokeNative(Native Method) 02-03 23:33:41.944: E/AndroidRuntime(22361): at java.lang.reflect.Method.invoke(Method.java:511) 02-03 23:33:41.944: E/ AndroidRuntime(22361): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994) 02-03 23:33:41.944: E/AndroidRuntime(22361): 在 com.android.internal.os .ZygoteInit .main(ZygoteInit.java:761) 02-03 23:33:41.944: E/AndroidRuntime(22361): at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 只是好奇 - 在将其放入捆绑包之前,您检查过 SurrogateKey != null 吗?
  • 否,因为如果显示的项目比它有 surrogateKey。这就是 SAP Mobile Server 维护移动业务对象之间关系的方式。我在调试器中签入。
  • 请发布完整的堆栈跟踪。
  • 另外 - 我不熟悉您的库,但您正在使用静态 Item.find() 调用来定位与您的代理键关联的项目。我的猜测是这个项目会导致 psmc.setText() 处的空值?
  • 是的,我只是在平板电脑上进行调试,它在设置那些 EditTexts 之前加载了 Item 对象,但该字段的值为 0,因为它们需要在应用程序中输入,然后更新到 SAP。这仅适用于 Activity,但在带有片段的 Mater 细节上,它会抛出 nullPointerException。

标签: android android-fragments


【解决方案1】:

您的 editPsmc EditText 在 fragment_item_detail 布局文件中吗?

如果是,你应该像这样抓取 EditText:

final EditText psmc = (EditText)rootView.findViewById(R.id.editPsmc);

我认为你的空指针是因为 EditText psmc 是空的,你不能在空对象上调用 setText()。

编辑:

在您的 Activity 中,您希望以这种方式检索密钥:

long key = getIntent().getLongExtra("surrogateKey", 0);

祝你好运!

【讨论】:

  • 再问一个问题。现在它可以在平板电脑上使用,但不能在手机上使用。您可以看到在 onItemSelected for twoPane 中生成 Bundle(参数),而在单个窗格中生成 detailIntent。在详细片段中加载 surrogateKey 时是否必须使用相同的逻辑?
  • 好的,我喜欢这个,它可以工作:) if (rootView.findViewById(R.id.item_detail_container) != null) { mTwoPane = true; } if (mTwoPane) { surrogateKeyItem = getArguments().getLong(ARG_ITEM_ID); } else { surrogateKeyItem = this.getActivity().getIntent().getLongExtra(ItemDetailFragment.ARG_ITEM_ID, 0); } Item item = Item.find(surrogateKeyItem);
猜你喜欢
  • 2014-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 2012-11-17
  • 2014-04-13
相关资源
最近更新 更多