Android片段UI元素在更改片段时消失?

Android片段UI元素在更改片段时消失?,android,android-fragments,Android,Android Fragments,我正在创建一个android应用程序,它有多个片段,每个片段对应一个功能。我目前使用抽屉访问每个功能,在一个特定功能中,我使用FragmentPagerAdapter访问。当我第一次创建并打开应用程序以访问我的片段时,在我的layout.xml文件中定义的UI元素将按预期加载。但是,当我使用抽屉切换到另一个片段并返回到原始片段时,原始UI元素就会消失 基本活动中的抽屉切换代码以访问不同的功能片段 public class BaseActivity extends AppCompatActivit

我正在创建一个android应用程序,它有多个片段,每个片段对应一个功能。我目前使用抽屉访问每个功能,在一个特定功能中,我使用
FragmentPagerAdapter
访问。当我第一次创建并打开应用程序以访问我的片段时,在我的
layout.xml
文件中定义的UI元素将按预期加载。但是,当我使用抽屉切换到另一个片段并返回到原始片段时,原始UI元素就会消失

基本活动中的抽屉切换代码以访问不同的功能片段

public class BaseActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener, ValueEventListener {
    FragmentManager fm;
    ArrayList<String> listOfAvailableRooms=new ArrayList<>();
    String timing="";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

        // start of own code
        fm = getSupportFragmentManager();
    }

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.base, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        return super.onOptionsItemSelected(item);
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        Fragment fragment;

        int id = item.getItemId();

        if (id == R.id.f_map) {
            fragment = new MapFragment();
        } else if (id == R.id.f_booking) {
            fragment = new CalendarFragment();
        } else if (id == R.id.f_roomSearch) {
            fragment = new RoomSearchFragment();
        } else if (id == R.id.f_authentication) {
            fragment = new AuthenticationFragment();
        } else if (id == R.id.nav_send) {
            fragment = new MapFragment().newInstance(3, new LatLng(-53.965623629921105, -5.974991060793399));
        } else {
            fragment = new MapFragment();
        }

        fm.beginTransaction().replace(R.id.main_container, fragment).commit();

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

    public class SectionsPagerAdapter extends FragmentPagerAdapter {

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            if (position == 0) return new MapFragment();
            return new MapFragment();
        }

        @Override
        public int getCount() {
            // Show 4 total pages.
            return 4;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            switch (position) {
                case 0:
                    return "Client";
                case 1:
                    return "Server";
            }
            return null;
        }
    }
}
public class CurrentBookings extends Fragment {
    private Button myButton;

    // newInstance constructer for creating fragment with arguments
    public static CurrentBookings newInstance(String title){
        CurrentBookings currentBookings = new CurrentBookings();
        Bundle args = new Bundle();
        args.putString("title",title);
        currentBookings.setArguments(args);
        return currentBookings;
    }

    // Store instance variables based on arguments passed
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        title = getArguments().getString("title");
    }

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

        myButton = (Button) view.findViewById(R.id.button1);
        return view;
    }
}
用户界面元素消失的片段

public class BaseActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener, ValueEventListener {
    FragmentManager fm;
    ArrayList<String> listOfAvailableRooms=new ArrayList<>();
    String timing="";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

        // start of own code
        fm = getSupportFragmentManager();
    }

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.base, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        return super.onOptionsItemSelected(item);
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        Fragment fragment;

        int id = item.getItemId();

        if (id == R.id.f_map) {
            fragment = new MapFragment();
        } else if (id == R.id.f_booking) {
            fragment = new CalendarFragment();
        } else if (id == R.id.f_roomSearch) {
            fragment = new RoomSearchFragment();
        } else if (id == R.id.f_authentication) {
            fragment = new AuthenticationFragment();
        } else if (id == R.id.nav_send) {
            fragment = new MapFragment().newInstance(3, new LatLng(-53.965623629921105, -5.974991060793399));
        } else {
            fragment = new MapFragment();
        }

        fm.beginTransaction().replace(R.id.main_container, fragment).commit();

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

    public class SectionsPagerAdapter extends FragmentPagerAdapter {

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            if (position == 0) return new MapFragment();
            return new MapFragment();
        }

        @Override
        public int getCount() {
            // Show 4 total pages.
            return 4;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            switch (position) {
                case 0:
                    return "Client";
                case 1:
                    return "Server";
            }
            return null;
        }
    }
}
public class CurrentBookings extends Fragment {
    private Button myButton;

    // newInstance constructer for creating fragment with arguments
    public static CurrentBookings newInstance(String title){
        CurrentBookings currentBookings = new CurrentBookings();
        Bundle args = new Bundle();
        args.putString("title",title);
        currentBookings.setArguments(args);
        return currentBookings;
    }

    // Store instance variables based on arguments passed
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        title = getArguments().getString("title");
    }

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

        myButton = (Button) view.findViewById(R.id.button1);
        return view;
    }
}
第一次打开片段时应用程序的屏幕截图

重访片段时应用程序的屏幕截图

UI元素仅在手机方向更改时再次出现。如何解决这个问题?

是的

您需要手动删除AuthenticationFragment的子片段

在设置适配器时,您必须将arraylist中的两个片段添加到parentFragment中,这样您就可以获得完整的片段列表,从而可以轻松地删除父片段的onDestroyView()上的片段

私有类AuthenticationFragment扩展了片段{
私有Arraylist fragmentList=新Arraylist();
私有void setAdapter(){
添加(新的FirstFragment());
添加(新的SecondFragment());
适配器代码
}
@凌驾
公共无效onDestroyView(){
super.onDestroyView();
final FragmentManager FragmentManager=getFragmentManager();
final FragmentTransaction FragmentTransaction=fragmentManager.beginTransaction();
for(片段:片段列表){
碎片事务。删除(碎片);
}
fragmentTransaction.commit();
}
}
因为您在AuthenticationFragment中使用了FragmentPagerAdapter

是的

您需要手动删除AuthenticationFragment的子片段

在设置适配器时,您必须将arraylist中的两个片段添加到parentFragment中,这样您就可以获得完整的片段列表,从而可以轻松地删除父片段的onDestroyView()上的片段

私有类AuthenticationFragment扩展了片段{
私有Arraylist fragmentList=新Arraylist();
私有void setAdapter(){
添加(新的FirstFragment());
添加(新的SecondFragment());
适配器代码
}
@凌驾
公共无效onDestroyView(){
super.onDestroyView();
final FragmentManager FragmentManager=getFragmentManager();
final FragmentTransaction FragmentTransaction=fragmentManager.beginTransaction();
for(片段:片段列表){
碎片事务。删除(碎片);
}
fragmentTransaction.commit();
}
}

因为您在AuthenticationFragment中使用了FragmentPagerAdapter

抽屉开关在哪里。请把密码寄出去。抽屉开关码在哪里。请发布代码。我可以澄清这是添加到基本活动代码(带抽屉)还是AuthenticationFragment代码中吗?我已经更新了代码。您应该在ArrayList中添加片段,并使用该ArrayList设置Adapter,以便可以轻松删除片段,否则将获得NullPointerException。在remove Method中,我是否可以澄清这是添加到基本活动代码(带抽屉)还是AuthenticationFragment代码中?我已经更新了代码。您应该在ArrayList中添加片段,并使用该ArrayList设置Adapter,以便可以轻松删除片段,否则将获得NullPointerException。移去法