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