我已经按照官方文档http://developer.android.com/guide/practices/tablets-and-handsets.html进行平板电脑支持,以创建双窗格布局,如下所示,在小屏幕(手机)中,它使用一个活动中的一个片段来显示对象列表和另一个Activity里面的另一个片段
我读过的所有其他文档都谈到了从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。
答案 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();
}
}