Android双重窗格 - 从详细信息到列表

时间:2015-05-06 05:31:01

标签: android android-fragments

我已经按照官方文档http://developer.android.com/guide/practices/tablets-and-handsets.html进行平板电脑支持,以创建双窗格布局,如下所示,在小屏幕(手机)中,它使用一个活动中的一个片段来显示对象列表和另一个Activity里面的另一个片段

Android Dual Pane Layout

我读过的所有其他文档都谈到了从Master到细节的单向流程,现在我想回到另一个方向,从细节到掌握,我被卡住了。

在细节中,我添加了一个我要在列表中显示的项目,我希望它是动态的,这样我就可以添加几个项目,每次点击保存时我都希望List增长。

这是我到目前为止所做的事情

在FragmentA(List Fragment)中,我有一个方法(重新)加载数据并在适配器上调用notifyDataSetChanged。 我在回调中添加了一个方法,每次添加一个项目时都会调用该方法。 Activity A和Activity B都实现了这个监听器 所以当我在FragmentB(Details Fragment)中添加一个项目时,我会调用监听器,并在活动A上调用双窗格布局我试试这个

  public void OnNewCustomerAdded() {
        Fragment frag = null;
        frag = getSupportFragmentManager().findFragmentByTag("CustomertListFragment");
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.detach(frag);
        ft.attach(frag);
        ft.commit();      

    }

不幸的是,抛出NPE,并且如果我直接在Fragment中调用方法来重新加载数据,那么抛出NPE。唯一可以解决一些副作用的是

  public void OnNewClientAdded() {
        Intent intent = getIntent();
        finish();
        startActivity(intent);
    }

那么如何在不重新启动其他片段的情况下安全地重新启动Activity中的Fragment。

1 个答案:

答案 0 :(得分:0)

哇,这是非常棘手的,从来没有预料到这会是一个挑战。这就是我解决它的方法。

首先,我删除了第二个活动并重新设计了代码,以便在手持设备中显示单个窗格,在平板电脑中显示双窗格,只使用一个Activity而不是两个。这不是必需的,但是当你处理一组生命周期和听众时它会有所帮助。

然后实际上在DetailsFragment中添加的项目会立即出现在ListFragment中,同时仍然打开Details Fragment。我完成了包含Activity,重新启动它并传递了一个intent,告诉它启动DetailsFragment

请记住,无论设备大小是多少,ListFragment都会设置为启动。所以你只需要启动DetailsFragment,因为已经有一个回调就可以了,所以这很容易,所以这里是代码

//Callback method for when an item is added, called from the Details 
   //Fragment
   public void OnNewCustomerAdded() {
        Intent mIntent = getIntent();
        mIntent.putExtra(Constants.SHOULD_START_CUSTOMER_DETAILS, true);
        finish();
        startActivity(mIntent);
      }

然后在活动的onCreate中,在ListFragment启动之后,你就这样做了

boolean shouldStartCustomerDetails = getIntent().getBooleanExtra(Constants.SHOULD_START_CLIENT_DETAILS, false);
        if (shouldStartClientDetails){
            OnCustomerListItemSelected(0);
        }

OnCustomertListItemSelected是您在Android Studio中创建主/详细信息活动时获得的标准mCallback侦听器,我只是将其修改为适合我的应用程序

 /**
     * Callback method from {@link OnCustomerListItemSelectedListener}
     * indicating that the item with the given ID was selected.
     */
    @Override
    public void OnCustomerListItemSelected(long id) {
        if (mTwoPane) {
            // In two-pane mode, show the detail view in this activity by
            // adding or replacing the detail fragment using a
            // fragment transaction.
            CustomerDetailsFragment fragment = CustomerDetailsFragment.newInstance(id);
                     getSupportFragmentManager().beginTransaction()
                    .replace(R.id.customeractivity_detail_container, fragment)
                    .commit();

        } else {
            // In single-pane mode, simply start the detail activity
            // for the selected item ID.
            CustomerDetailsFragment fragment =
                    CustomerDetailsFragment.newInstance(getIntent().getLongExtra(Constants.ARG_ITEM_ID, 0));
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.customeractivity_list_container, fragment)
                    .commit();

        }
    }