#android #android-fragments #android-tablayout #tabitem
#Android #android-фрагменты #android-tablayout #tabitem
Вопрос:
У меня есть приложение для Android TabLayout
, я создаю TabItems
и назначаю их своим TabLayout
динамически с помощью кода в моем MainActivity, в одном из моих Fragments
, который является Fragment
for a TabItem
, у меня есть кнопка. я хочу, чтобы при нажатии на эту кнопку она TabItem
закрывалась и уничтожалась, как я могу этого добиться? дополнительное объяснение: ниже приведен мой MainActivity.java
код (где существует большая часть моего кода для создания динамического TabItems
:
public class MainActivity extends AppCompatActivity implements ContactsFragment.CallBacks {
public static List<Fragment> fragments = new ArrayList<>();
public static List<String> fragmentsTitle = new ArrayList<>();
ViewPager viewPager;
TabLayout tabLayout;
public List<Fragment> getFragments() {
return fragments;
}
public List<String> getFragmentsTitle() {
return fragmentsTitle;
}
public void addToFragments(Fragment fragment) {
fragments.add(fragment);
}
public void addToFragmentsTitle(String title) {
fragmentsTitle.add(title);
}
public Fragment getFragmentsWithPosition(int position) {
return fragments.get(position);
}
public String getFragmentsTitleWithPosition(int position) {
return fragmentsTitle.get(position);
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_page_drawer);
this.tabLayout = findViewById(R.id.tab_layout);
this.viewPager = findViewById(R.id.view_pager);
tabLayout.setupWithViewPager(viewPager);
SetUpViewPager(viewPager);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
}
public void SetUpViewPager(ViewPager viewPager) {
MyViewPagerAdapter Adapter = new MyViewPagerAdapter((getSupportFragmentManager()));
Adapter.AddFragmentPage(new SignInFragment(),"ورود");
Adapter.AddFragmentPage(new ContactsFragment(),"ارتباطات");
Adapter.AddFragmentPage(new RegisterFragment(),"ثبت نام");
viewPager.setAdapter(Adapter);
}
@Override
public void send_user_object() {
/* this is the implementation of abstract function defined
in one of my tab , in which it has a button and when
button is clicked i want the tab to be removed . */
}
public class MyViewPagerAdapter extends FragmentPagerAdapter {
public MyViewPagerAdapter(FragmentManager manager) {
super(manager);
}
public void AddFragmentPage(Fragment frag,String title) {
MainActivity.this.addToFragments(frag);
MainActivity.this.addToFragmentsTitle(title);
}
public Fragment getItem(int position) {
return MainActivity.this.getFragmentsWithPosition(position);
}
public CharSequence getPageTitle(int position) {
return MainActivity.this.getFragmentsTitleWithPosition(position);
}
public int getCount() {
List<Fragment> frag = MainActivity.this.getFragments();
return frag.size();
}
}
}
на одной из моих предопределенных вкладок у меня есть listview, когда пользователь нажимает на элемент в представлении списка, подробная информация об элементе открывается на новой вкладке, затем пользователь может просмотреть подробную информацию, нажав на эту вкладку . я хочу, чтобы пользователь мог закрыть (уничтожить) эту вкладку сведений об одном из элементов? (помните, что он создается динамически)
как я могу удалить (закрыть) TabItem
нажатием кнопки в этом фрагменте TabItem?
Пожалуйста, помогите мне, заранее благодарю вас.
Ответ №1:
Не рекомендуется изменять горизонтальную навигацию, добавляя другой фрагмент. Если это не требуется вашему клиенту, создайте новый фрагмент и просто замените текущий следующим образом:
Fragment detailsFragment=new ContactsFragment()
getSupportFragmentManager.beginTransaction()
.addToBackStack("tag")
.replace(R.id.containerName, detailsFragment, "another_tag")
.commit()
В вашем DetailsFragment просто вызовите ClickListener вашей кнопки закрытия getActivity.getSupportFragmentManager.popBackStack()
, и он восстановит предыдущее состояние.
Надеюсь, я смогу вам помочь.
Комментарии:
1. я добавил решение, но есть странная проблема, я не могу удалить
TabItem
, когда я нахожусь на этой вкладке!! программа вылетает. но я могу вызвать свойclose_tabitem()
метод из меню или когда я на другомtabitem
Ответ №2:
Я решил свою проблему с помощью :
во-первых) создание интерфейса в UserDetailFragment
, который вы все знаете для общения MainActivity
, я должен был это сделать.
но для чего мне нужно было общаться с MainActivity
? Ответ: как вы видите в моем коде, там определен мой класс FragmentPagerAdapter , и мне нужен был мой public List<Fragment> fragments = new ArrayList<>();
и public static List<String> fragmentsTitle = new ArrayList<>();
что я сохранил в них свои фрагменты, а также mytabLayout
.
Во-вторых) я должен был определить tabLayout.addOnTabSelectedListener(){}
с помощью своего метода OnTabSelected()
, мне это было нужно, потому что я получаю текущий индекс вкладки, используя addOnTabSelectedListener(){}
.
В-третьих) я определил removeTabPage(int position)
в FragmentPagerAdapter .
Далее) я создал метод, как показано ниже (который является реализацией абстрактного метода UserDetailFragment
интерфейса.
@Override
public void close_tabitem() {
tabLayout.removeTabAt(tabposition_number);
MyViewPagerAdapter Adapter = new MyViewPagerAdapter(getSupportFragmentManager());
Adapter.removeTabPage(tabposition_number);
Adapter.notifyDataSetChanged();
}
и вот весь мой код для: MainActivity.Java
public class MainActivity extends AppCompatActivity implements ContactsFragment.CallBacks, UserDetailFragment.DetailCallBacks {
android.support.v7.widget.Toolbar toolbar;
public static List<Fragment> fragments = new ArrayList<>();
public static List<String> fragmentsTitle = new ArrayList<>();
ViewPager viewPager;
TabLayout tabLayout;
int tabposition_number;
public List<Fragment> getFragments() {
return fragments;
}
public List<String> getFragmentsTitle() {
return fragmentsTitle;
}
public void addToFragments(Fragment fragment) {
fragments.add(fragment);
}
public void addToFragmentsTitle(String title) {
fragmentsTitle.add(title);
}
public Fragment getFragmentsWithPosition(int position) {
return fragments.get(position);
}
public String getFragmentsTitleWithPosition(int position) {
return fragmentsTitle.get(position);
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_page_drawer);
this.tabLayout = findViewById(R.id.tab_layout);
this.viewPager = findViewById(R.id.view_pager);
tabLayout.setupWithViewPager(viewPager);
SetUpViewPager(viewPager);
this.toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
NavigationView navigationView = findViewById(R.id.navigation_view);
navigationView.setItemIconTintList(null);
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener(){
@Override
public void onTabSelected(TabLayout.Tab tab) {
tabposition_number = tab.getPosition();
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
}
public void SetUpViewPager(ViewPager viewPager) {
MyViewPagerAdapter Adapter = new MyViewPagerAdapter((getSupportFragmentManager()));
Adapter.AddFragmentPage(new SignInFragment(),"ورود");
Adapter.AddFragmentPage(new ContactsFragment(),"ارتباطات");
Adapter.AddFragmentPage(new RegisterFragment(),"ثبت نام");
viewPager.setAdapter(Adapter);
}
@Override
public void send_user_object(UserObject userObject) {
// tabLayout.removeTabAt(tabposition_number);
// myViewPagerAdapter.remove
}
@Override
public void create_user_detail_tab(UserObject userObject) {
MyViewPagerAdapter Adapter = new MyViewPagerAdapter(getSupportFragmentManager());
UserDetailFragment userDetailFragment = new UserDetailFragment();
Bundle bundle = new Bundle();
bundle.putString("name",userObject.getName());
bundle.putString("family",userObject.getFamily());
bundle.putString("email",userObject.getEmail());
userDetailFragment.setArguments(bundle);
Adapter.AddFragmentPage(userDetailFragment,userObject.getName());
viewPager.setAdapter(Adapter);
}
@Override
public void close_tabitem() {
tabLayout.removeTabAt(tabposition_number);
MyViewPagerAdapter Adapter = new MyViewPagerAdapter(getSupportFragmentManager());
Adapter.removeTabPage(tabposition_number);
Adapter.notifyDataSetChanged();
}
public class MyViewPagerAdapter extends FragmentPagerAdapter {
public MyViewPagerAdapter(FragmentManager manager) {
super(manager);
}
public void removeTabPage(int position) {
fragments.remove(position);
fragmentsTitle.remove(position);
notifyDataSetChanged();
}
public void AddFragmentPage(Fragment frag,String title) {
MainActivity.this.addToFragments(frag);
MainActivity.this.addToFragmentsTitle(title);
}
public Fragment getItem(int position) {
return MainActivity.this.getFragmentsWithPosition(position);
}
public CharSequence getPageTitle(int position) {
return MainActivity.this.getFragmentsTitleWithPosition(position);
}
public int getCount() {
List<Fragment> frag = MainActivity.this.getFragments();
return frag.size();
}
}
}
и вот тот UserDetailFragment.Java
, который действует как мой TabItem
:
public class UserDetailFragment extends Fragment {
View view;
DetailCallBacks detailCallBacks;
public UserDetailFragment() {}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.user_detail_fragment,null);
return view;
}
@Override
public void onResume() {
super.onResume();
Button closebtn = view.findViewById(R.id.detail_close_button);
closebtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
detailCallBacks.close_tabitem();
}
});
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
detailCallBacks = (DetailCallBacks)context;
}
public interface DetailCallBacks {
public void close_tabitem();
}
}
Надеюсь, это вам поможет.
Но помните, вы не можете использовать это button
. поместите кнопку в какой-либо другой tabitem
или в menu
.
или вы можете использовать :
TabLayout.Tab tab = tabLayout.getTabAt(2);
tab.select();
чтобы изменить tabitem, а затем запустить событие.
наслаждайтесь…..