Jawaban:
Jika Anda tahu indeks tab yang ingin Anda pilih, Anda dapat melakukannya seperti:
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
TabLayout.Tab tab = tabLayout.getTabAt(someIndex);
tab.select();
Teknik ini berfungsi bahkan jika Anda menggunakan TabLayout dengan sendirinya tanpa ViewPager (yang tidak lazim, dan mungkin praktik yang buruk, tetapi saya telah melihatnya selesai).
Inilah cara saya menyelesaikannya:
void selectPage(int pageIndex){
tabLayout.setScrollPosition(pageIndex,0f,true);
viewPager.setCurrentItem(pageIndex);
}
Gunakan ini:
tabs.getTabAt(index).select();
Objects.requireNonNull(tabs.getTabAt(position)).select();
aman digunakan
Gunakan ini:
<android.support.design.widget.TabLayout
android:id="@+id/patienthomescreen_tabs"
android:layout_width="match_parent"
android:layout_height="72sp"
app:tabGravity="fill"
app:tabMode="fixed"
app:tabIndicatorColor="@android:color/white"
app:tabSelectedTextColor="@color/green"/>
Setelah di OnClickListener:
TabLayout tabLayout = (TabLayout) findViewById(R.id.patienthomescreen_tabs);
TabLayout.Tab tab = tabLayout.getTabAt(someIndex);
tab.select();
Ini mungkin bukan solusi akhir , dan itu mengharuskan Anda menggunakan TabLayout
bersama - sama denganViewPager
, tetapi ini adalah bagaimana saya menyelesaikannya:
void selectPage(int pageIndex)
{
viewPager.setCurrentItem(pageIndex);
tabLayout.setupWithViewPager(viewPager);
}
Saya menguji seberapa besar dampak kinerja dari penggunaan kode ini dengan pertama-tama melihat CPU- dan monitor memori di Android Studio sambil menjalankan metode ini, kemudian membandingkannya dengan beban yang diletakkan pada CPU dan memori ketika saya menavigasi antar halaman. sendiri (menggunakan gerakan gesek), dan perbedaannya tidak terlalu besar, jadi setidaknya itu bukan solusi yang mengerikan ...
Semoga ini bisa membantu seseorang!
tabLayout.setScrollPosition(pageIndex,0f,true);
), ketika saya mengklik tab di sebelah kanan, itu tidak memperbarui halaman ViewPager (saya tidak tahu mengapa). Hanya dengan mengklik kembali pada tab kiri & kemudian pada tab kanan lagi akhirnya akan memperbarui halaman untuk memiliki halaman tab kanan, yang sangat glitchy. Tetapi solusi ini tidak memiliki gangguan.
Jika Anda tidak dapat menggunakan tab.select () dan Anda tidak ingin menggunakan ViewPager, Anda masih dapat memilih tab secara terprogram. Jika Anda menggunakan tampilan khusus melalui TabLayout.Tab setCustomView(android.view.View view)
itu lebih sederhana. Inilah cara melakukannya dengan dua cara.
// if you've set a custom view
void updateTabSelection(int position) {
// get the position of the currently selected tab and set selected to false
mTabLayout.getTabAt(mTabLayout.getSelectedTabPosition()).getCustomView().setSelected(false);
// set selected to true on the desired tab
mTabLayout.getTabAt(position).getCustomView().setSelected(true);
// move the selection indicator
mTabLayout.setScrollPosition(position, 0, true);
// ... your logic to swap out your fragments
}
Jika Anda tidak menggunakan tampilan khusus maka Anda dapat melakukannya seperti ini
// if you are not using a custom view
void updateTabSelection(int position) {
// get a reference to the tabs container view
LinearLayout ll = (LinearLayout) mTabLayout.getChildAt(0);
// get the child view at the position of the currently selected tab and set selected to false
ll.getChildAt(mTabLayout.getSelectedTabPosition()).setSelected(false);
// get the child view at the new selected position and set selected to true
ll.getChildAt(position).setSelected(true);
// move the selection indicator
mTabLayout.setScrollPosition(position, 0, true);
// ... your logic to swap out your fragments
}
Gunakan StateListDrawable untuk beralih antara drawables yang dipilih dan yang tidak dipilih atau yang serupa untuk melakukan apa yang Anda inginkan dengan warna dan / atau drawables.
Cukup atur viewPager.setCurrentItem(index)
dan TabLayout terkait akan memilih tab masing-masing.
coba ini
new Handler().postDelayed(
new Runnable(){
@Override
public void run() {
if (i == 1){
tabLayout.getTabAt(0).select();
} else if (i == 2){
tabLayout.getTabAt(1).select();
}
}
}, 100);
Agak terlambat tapi mungkin solusi yang bermanfaat. Saya menggunakan TabLayout saya langsung di Fragmen saya dan mencoba untuk memilih tab cukup awal dalam Siklus Hidup Fragmen. Apa yang berhasil bagi saya adalah menunggu sampai TabLayout selesai menggambar pandangan anaknya dengan menggunakan android.view.View#post
metode. yaitu:
int myPosition = 0;
myFilterTabLayout.post(() -> { filterTabLayout.getTabAt(myPosition).select(); });
new Handler().postDelayed(()->{ tabLayout.post(() -> { tabLayout.getTabAt(myPosition).select(); }); },200);
Saya sedang menggunakan TabLayout untuk beralih fragmen. Ini berfungsi sebagian besar, kecuali setiap kali saya mencoba memilih tab menggunakan program tab.select()
, saya TabLayout.OnTabSelectedListener
akan memicu onTabSelected(TabLayout.Tab tab)
, yang akan menyebabkan saya banyak kesedihan. Saya mencari cara untuk melakukan seleksi terprogram tanpa memicu pendengar.
Jadi saya mengadaptasi jawaban @kenodoggy untuk saya gunakan. Saya selanjutnya menghadapi masalah di mana beberapa objek internal akan mengembalikan nol (karena mereka belum dibuat, karena saya menjawab onActivityResult()
dari fragmen saya, yang terjadi sebelum onCreate()
dalam kasus aktivitas singleTask
atau singleInstance
) jadi saya menulis detail jika / / Urutan lain yang akan melaporkan kesalahan dan gagal tanpa NullPointerException
yang sebaliknya akan memicu. Saya menggunakan Kayu untuk logging, jika Anda tidak menggunakan pengganti dengan Log.e()
.
void updateSelectedTabTo(int position) {
if (tabLayout != null){
int selected = tabLayout.getSelectedTabPosition();
if (selected != -1){
TabLayout.Tab oldTab = tabLayout.getTabAt(0);
if (oldTab != null){
View view = oldTab.getCustomView();
if (view != null){
view.setSelected(false);
}
else {
Timber.e("oldTab customView is null");
}
}
else {
Timber.e("oldTab is null");
}
}
else {
Timber.e("selected is -1");
}
TabLayout.Tab newTab = tabLayout.getTabAt(position);
if (newTab != null){
View view = newTab.getCustomView();
if (view != null){
view.setSelected(false);
}
else {
Timber.e("newTab customView is null");
}
}
else {
Timber.e("newTab is null");
}
}
else {
Timber.e("tablayout is null");
}
}
Di sini, tabLayout adalah variabel memori saya terikat ke TabLayout
objek di XML saya. Dan saya tidak menggunakan fitur tab gulir jadi saya menghapusnya juga.
Anda harus menggunakan viewPager untuk menggunakan viewPager.setCurrentItem ()
viewPager.setCurrentItem(n);
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
tambahkan untuk viewpager Anda:
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
array.clear();
switch (position) {
case 1:
//like a example
setViewPagerByIndex(0);
break;
}
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
// pada penangan untuk mencegah kerusakan karena memori
private void setViewPagerByIndex(final int index){
Application.getInstance().getHandler().post(new Runnable() {
@Override
public void run() {
viewPager.setCurrentItem(index);
}
});
}
Dengan TabLayout
disediakan oleh Perpustakaan Komponen Bahan hanya menggunakan selectTab
metode:
TabLayout tabLayout = findViewById(R.id.tab_layout);
tabLayout.selectTab(tabLayout.getTabAt(index));
Itu membutuhkan versi 1.1.0.
Secara default jika Anda memilih tab itu akan disorot. Jika Anda ingin memilih secara eksplisit berarti menggunakan kode komentar yang diberikan di bawah onTabSelected (TabLayout.Tab tab) dengan posisi indeks tab yang ditentukan. Kode ini akan menjelaskan tentang perubahan fragmen pada posisi yang dipilih tab menggunakan viewpager.
public class GalleryFragment extends Fragment implements TabLayout.OnTabSelectedListener
{
private ViewPager viewPager;public ViewPagerAdapter adapter;private TabLayout tabLayout;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_gallery, container, false);
viewPager = (ViewPager) rootView.findViewById(R.id.viewpager);
adapter = new ViewPagerAdapter(getChildFragmentManager());
adapter.addFragment(new PaymentCardFragment(), "PAYMENT CARDS");
adapter.addFragment(new LoyaltyCardFragment(), "LOYALTY CARDS");
viewPager.setAdapter(adapter);
tabLayout = (TabLayout) rootView.findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
tabLayout.setOnTabSelectedListener(this);
}
@Override
public void onTabSelected(TabLayout.Tab tab) {
//This will be called 2nd when you select a tab or swipe using viewpager
final int position = tab.getPosition();
Log.i("card", "Tablayout pos: " + position);
//TabLayout.Tab tabdata=tabLayout.getTabAt(position);
//tabdata.select();
tabLayout.post(new Runnable() {
@Override
public void run() {
if (position == 0) {
PaymentCardFragment paymentCardFragment = getPaymentCardFragment();
if (paymentCardFragment != null) {
VerticalViewpager vp = paymentCardFragment.mypager;
if(vp!=null)
{
//vp.setCurrentItem(position,true);
vp.setCurrentItem(vp.getAdapter().getCount()-1,true);
}
}
}
if (position == 1) {
LoyaltyCardFragment loyaltyCardFragment = getLoyaltyCardFragment();
if (loyaltyCardFragment != null) {
VerticalViewpager vp = loyaltyCardFragment.mypager;
if(vp!=null)
{
vp.setCurrentItem(position);
}
}
}
}
});
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
//This will be called 1st when you select a tab or swipe using viewpager
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
//This will be called only when you select the already selected tab(Ex: selecting 3rd tab again and again)
}
private PaymentCardFragment getLoyaltyCardFragment() {
Fragment f = adapter.mFragmentList.get(viewPager.getCurrentItem());
if(f instanceof PaymentCardFragment)
{
return (PaymentCardFragment) f;
}
return null;
}
private LoyaltyCardFragment getPaymentCardFragment() {
Fragment f = adapter.mFragmentList.get(viewPager.getCurrentItem());
if(f instanceof LoyaltyCardFragment)
{
return (LoyaltyCardFragment) f;
}
return null;
}
class ViewPagerAdapter extends FragmentPagerAdapter {
public List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
}
}
Ini juga bisa membantu
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int i, float v, int i1) {
}
@Override
public void onPageSelected(int i) {
tablayout.getTabAt(i).select();
}
@Override
public void onPageScrollStateChanged(int i) {
}
});
Jika kebetulan bahwa tab default Anda adalah yang pertama (0) dan Anda kebetulan beralih ke fragmen, maka Anda harus secara manual mengganti fragmen untuk pertama kalinya. Ini karena tab dipilih sebelum pendengar terdaftar.
private TabLayout mTabLayout;
...
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_tablayout, container, false);
mTabLayout = view.findViewById(R.id.sliding_tabs);
mTabLayout.addOnTabSelectedListener(mOnTabSelectedListener);
getActivity().getSupportFragmentManager().beginTransaction()
.replace(R.id.tabContent, MyFirstFragment.newInstance()).commit();
return view;
}
Atau, Anda dapat mempertimbangkan menelepon getTabAt(0).select()
dan mengganti onTabReselected
seperti:
@Override
public void onTabReselected(TabLayout.Tab tab) {
// Replace the corresponding tab fragment.
}
Ini akan berhasil karena Anda pada dasarnya mengganti fragmen pada setiap tab pilih kembali.
Anda dapat mengatur posisi TabLayout menggunakan fungsi berikut
public void setTab(){
tabLayout.setScrollPosition(YOUR_SCROLL_INDEX,0,true);
tabLayout.setSelected(true);
}
Jika Anda kesulitan memahami, kode ini dapat membantu Anda
private void MyTabLayout(){
TabLayout.Tab myTab = myTabLayout.newTab(); // create a new tab
myTabLayout.addTab(myTab); // add my new tab to myTabLayout
myTab.setText("new tab");
myTab.select(); // select the new tab
}
Anda juga dapat menambahkan ini ke kode Anda:
myTabLayout.setTabTextColors(getColor(R.color.colorNormalTab),getColor(R.color.colorSelectedTab));
Coba dengan cara ini.
tabLayout.setTabTextColors(getResources().getColor(R.color.colorHintTextLight),
getResources().getColor(R.color.colorPrimaryTextLight));
jika Anda menggunakan TabLayout tanpa viewPager, ini membantu
mTitles = getResources().getStringArray(R.array.tabItems);
mIcons = getResources().obtainTypedArray(R.array.tabIcons);
for (int i = 0; i < mTitles.length; i++) {
tabs.addTab(tabs.newTab().setText(mTitles[i]).setIcon(mIcons.getDrawable(i)));
if (i == 0) {
/*For setting selected position 0 at start*/
Objects.requireNonNull(Objects.requireNonNull(tabs.getTabAt(i)).getIcon()).setColorFilter(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimary), PorterDuff.Mode.SRC_IN);
}
}
tabs.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
Objects.requireNonNull(tab.getIcon()).setColorFilter(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimary), PorterDuff.Mode.SRC_IN);
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
Objects.requireNonNull(tab.getIcon()).setColorFilter(ContextCompat.getColor(getApplicationContext(), R.color.white), PorterDuff.Mode.SRC_IN);
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
Memperbaiki Kotlin
viewPager.currentItem = 0
tabs.setupWithViewPager (viewPager)
TabLayout jobTabs = v.findViewById(R.id.jobTabs);
ViewPager jobFrame = v.findViewById(R.id.jobPager);
jobFrame.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(jobTabs));
ini akan memilih tab sebagai tampilan halaman geser halaman
TabLayout.Tab.select()
: "Pilih tab ini. Hanya valid jika tab telah ditambahkan ke panel tindakan."