Java listfragment被嵌套片段替换后,视图控件仍保留

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

我有一个选项卡式视图活动,有3个选项卡,每个选项卡中有一个片段。这些片段由链接到viewpager的
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();
    }


}