Java listfragment被嵌套片段替换后,视图控件仍保留
我有一个选项卡式视图活动,有3个选项卡,每个选项卡中有一个片段。这些片段由链接到viewpager的Java listfragment被嵌套片段替换后,视图控件仍保留,java,android,android-layout,android-fragments,android-listfragment,Java,Android,Android Layout,Android Fragments,Android Listfragment,我有一个选项卡式视图活动,有3个选项卡,每个选项卡中有一个片段。这些片段由链接到viewpager的FragmentPageAdapter管理 一切正常,直到我尝试使用第四个片段(ServiceSpecificNotListFragment),它将是由FragmentPageAdapter管理的其中一个片段(ServicesListFragment)的嵌套片段 当我尝试用ServiceSpecificNotListFragment替换ServicesListFragment时。我设法用Servi
FragmentPageAdapter
管理
一切正常,直到我尝试使用第四个片段(ServiceSpecificNotListFragment),它将是由FragmentPageAdapter
管理的其中一个片段(ServicesListFragment)的嵌套片段
当我尝试用ServiceSpecificNotListFragment替换ServicesListFragment时。我设法用ServiceSpecifiNotListFragment仅替换ServicesListFragment中的list元素,ServicesListFragment中的另一个视图控制器(按钮)仍然保留
我一直在想,问题是否在于我用子片段替换片段的方法是transaction.replace(R.id.service_list_fragment,newFragment).commit()
和服务\u列表\u fragment是listfragment主线性布局的id,其中包含使用id定义的listview:@id/android:list
我发现与此最接近的问答是,但据我所知,我正确地使用了片段容器id
以下是代码和布局:
ServicesListFragment(嵌套片段的父级)的布局
ServiceSpecificNotListFragment的布局(要嵌套的片段)
主要活动xml布局(基本上是对寻呼机的引用):
ServiceListFragment的源代码,对片段嵌套的调用位于onListItemClick
:
公共类ServicesListFragment扩展ListFragment{
私有最终字符串标记=“ServicesListFragment”;
按钮addButton=null;
ServiceNotifRowAdapter适配器;
ArrayList=新建ArrayList();
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
活动父级=getActivity();
//使用存储订阅列表填充适配器的一些常用代码
adapter=新的ServiceNotifRowAdapter(getActivity().getApplicationContext(),list);
setListAdapter(适配器);
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图根视图=充气机。充气(R.layout.servicelist_片段,容器,false);
addButton=(Button)rootView.findViewById(R.id.addServiceButton);
MainActivity m=(MainActivity)getActivity();
addButton.setOnClickListener(m);
返回rootView;
}
@凌驾
public void onListItemClick(列表视图l、视图v、整数位置、长id){
NotifService项=(NotifService)getListAdapter().getItem(位置);
Log.d(标记“所选服务”+item.getServiceURI());
Fragment newFragment=新服务SpecificNotListFragment();
Bundle=新Bundle();
bundle.putString(“服务”,item.getServiceURI());
setArguments(bundle);
FragmentTransaction=getChildFragmentManager().beginTransaction();
transaction.addToBackStack(空);
transaction.replace(R.id.service_list_fragment,newFragment).commit();
}
主要活动java代码
public class MainActivity extends FragmentActivity implements TabListener, AddServiceDialogFragmentListener
, OnClickListener{
private final String TAG = "MQTT main activity";
private ViewPager viewPager;
private TabsPagerAdapter mAdapter;
private ActionBar actionBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Initilization
viewPager = (ViewPager) findViewById(R.id.pager);
actionBar = getActionBar();
List<Fragment> fragments = new Vector<Fragment>();
fragments.add(Fragment.instantiate(this, StatusListFragment.class.getName()));
fragments.add(Fragment.instantiate(this, ServicesListFragment.class.getName()));
fragments.add(Fragment.instantiate(this, ConfigFragment.class.getName()));
mAdapter = new TabsPagerAdapter(getSupportFragmentManager(),fragments);
viewPager.setAdapter(mAdapter);
actionBar.setHomeButtonEnabled(false);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
// Adding Tabs
for (String tab_name : MqttApplication.tabs) {
actionBar.addTab(actionBar.newTab().setText(tab_name)
.setTabListener(this));
}
/**
* on swiping the viewpager make respective tab selected
* */
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
// on changing the page
// make respected tab selected
actionBar.setSelectedNavigationItem(position);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
// lock the screen in portrait mode
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
}
public类MainActivity扩展了FragmentActivity实现了TabListener、AddServiceDialogFragmentListener
,OnClickListener{
私有最终字符串标记=“MQTT主活动”;
私人视页机视页机;
私人TabsPagerAdapter mAdapter;
私人ActionBar ActionBar;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化
viewPager=(viewPager)findViewById(R.id.pager);
actionBar=getActionBar();
列表片段=新向量();
add(Fragment.instantiate(这是StatusListFragment.class.getName());
add(Fragment.instantiate(这是ServicesListFragment.class.getName());
add(Fragment.instantiate(这是ConfigFragment.class.getName());
mAdapter=new TabsPagerAdapter(getSupportFragmentManager(),fragments);
viewPager.setAdapter(mAdapter);
actionBar.setHomeButtonEnabled(假);
actionBar.setNavigationMode(actionBar.NAVIGATION\u MODE\u选项卡);
//添加选项卡
用于(字符串选项卡\名称:MqttApplication.tabs){
actionBar.addTab(actionBar.newTab().setText(选项卡名称)
.setTabListener(本));
}
/**
*滑动viewpager时,选择相应的选项卡
* */
viewPager.setOnPageChangeListener(新的viewPager.OnPageChangeListener(){
@凌驾
已选择页面上的公共无效(内部位置){
//关于更改页面
//选择“受尊重”选项卡
actionBar.setSelectedNavigationItem(位置);
}
@凌驾
已滚动页面上的公共void(int arg0、float arg1、int arg2){
}
@凌驾
公共无效onPageScrollStateChanged(int arg0){
}
});
//将屏幕锁定为纵向模式
setRequestedOrientation(ActivityInfo.SCREEN\u ORIENTATION\u Picture);
}
@凌驾
已重新选择公共无效页签(页签,碎片事务){
//TODO自动生成的方法存根
}
@凌驾
已选择的公共事务(选项卡,碎片事务ft){
setCurrentItem(tab.getPosition());
}
@凌驾
已选择公共空页(选项卡,碎片事务ft){
//TODO自动生成
public class TabsPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fragments;
private FragmentManager fm;
private final String TAG = "TabsPagerAdapter";
public TabsPagerAdapter(FragmentManager fm,List<Fragment> fragments) {
super(fm);
this.fm = fm;
this.fragments = fragments;
}
@Override
public Fragment getItem(int index) {
return this.fragments.get(index);
}
@Override
public int getCount() {
return this.fragments.size();
}
// 0 - Status, 1 Service, 2 Config (due to the order in which they have been added)
public Fragment findFragmentByPosition(int position) {
return fm.findFragmentByTag(
"android:switcher:" + R.id.pager + ":"
+ this.getItemId(position));
}
}
public class ServicesListFragment extends ListFragment {
private final String TAG = "ServicesListFragment";
Button addButton = null;
ServiceNotifRowAdapter adapter;
ArrayList<NotifService> list = new ArrayList<NotifService>();
private onListItemClickCallbackListener mCallback;
public interface onListItemClickCallbackListener {
public void replaceFragmentToServiveListNot();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Activity parent = getActivity();
mCallback = parent; // remember to imlement onListItemClickCallbackListener in activity else it will give error
// some ommited code for populating adapter with list of stored subscriptions
adapter = new ServiceNotifRowAdapter(getActivity().getApplicationContext(),list);
setListAdapter(adapter);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.servicelist_fragment, container, false);
addButton = (Button) rootView.findViewById(R.id.addServiceButton);
MainActivity m = (MainActivity) getActivity();
addButton.setOnClickListener(m);
return rootView;
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
NotifService item = (NotifService) getListAdapter().getItem(position);
Log.d(TAG, "selected service " + item.getServiceURI());
mCallback.replaceFragmentToServiveListNot();
}
}
public class MainActivity extends FragmentActivity implements TabListener, AddServiceDialogFragmentListener
, OnClickListener,onListItemClickCallbackListener {
private final String TAG = "MQTT main activity";
private ViewPager viewPager;
private TabsPagerAdapter mAdapter;
private ActionBar actionBar;
List<Fragment> fragments;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Initilization
viewPager = (ViewPager) findViewById(R.id.pager);
actionBar = getActionBar();
fragments = new Vector<Fragment>();
fragments.add(Fragment.instantiate(this, StatusListFragment.class.getName()));
fragments.add(Fragment.instantiate(this, ServicesListFragment.class.getName()));
fragments.add(Fragment.instantiate(this, ConfigFragment.class.getName()));
mAdapter = new TabsPagerAdapter(getSupportFragmentManager(),fragments);
viewPager.setAdapter(mAdapter);
actionBar.setHomeButtonEnabled(false);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
// Adding Tabs
for (String tab_name : MqttApplication.tabs) {
actionBar.addTab(actionBar.newTab().setText(tab_name)
.setTabListener(this));
}
/**
* on swiping the viewpager make respective tab selected
* */
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
// on changing the page
// make respected tab selected
actionBar.setSelectedNavigationItem(position);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
// lock the screen in portrait mode
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
@Override
public void replaceFragmentToServiveListNot() {
fragments.removeAll(fragments);
fragments.add(Fragment.instantiate(this, StatusListFragment.class.getName()));
fragments.add(Fragment.instantiate(this, ServiceSpecifNotListFragment.class.getName()));
fragments.add(Fragment.instantiate(this, ConfigFragment.class.getName()));
mAdapter.notifyDataSetChanged();
}
}