1

在Tablayout實踐中,我遵循link的這段代碼。但問題是,雖然我目前的標籤上顯示的下一個標籤麪包和Log-cat.Here是我的代碼在當前選項卡位置的Android Tablayout顯示下一個選項卡Toast and Logs

ScrollableTabsActivity.java

package info.androidhive.materialtabs.activity; 

import android.os.Bundle; 
import android.support.design.widget.TabLayout; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 

import java.util.ArrayList; 
import java.util.List; 

import info.androidhive.materialtabs.R; 
import info.androidhive.materialtabs.fragments.EightFragment; 
import info.androidhive.materialtabs.fragments.FiveFragment; 
import info.androidhive.materialtabs.fragments.FourFragment; 
import info.androidhive.materialtabs.fragments.NineFragment; 
import info.androidhive.materialtabs.fragments.OneFragment; 
import info.androidhive.materialtabs.fragments.SevenFragment; 
import info.androidhive.materialtabs.fragments.SixFragment; 
import info.androidhive.materialtabs.fragments.TenFragment; 
import info.androidhive.materialtabs.fragments.ThreeFragment; 
import info.androidhive.materialtabs.fragments.TwoFragment; 

public class ScrollableTabsActivity extends AppCompatActivity { 

private Toolbar toolbar; 
private TabLayout tabLayout; 
private ViewPager viewPager; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_scrollable_tabs); 

    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    viewPager = (ViewPager) findViewById(R.id.viewpager); 
    setupViewPager(viewPager); 

    tabLayout = (TabLayout) findViewById(R.id.tabs); 
    tabLayout.setupWithViewPager(viewPager); 
} 
private void setupViewPager(ViewPager viewPager) { 
    ViewPagerAdapter adapter = new 
    ViewPagerAdapter(getSupportFragmentManager()); 
    adapter.addFrag(new OneFragment(), "ONE"); 
    adapter.addFrag(new TwoFragment(), "TWO"); 
    adapter.addFrag(new ThreeFragment(), "THREE"); 
    adapter.addFrag(new FourFragment(), "FOUR"); 
    adapter.addFrag(new FiveFragment(), "FIVE"); 
    adapter.addFrag(new SixFragment(), "SIX"); 
    adapter.addFrag(new SevenFragment(), "SEVEN"); 
    adapter.addFrag(new EightFragment(), "EIGHT"); 
    adapter.addFrag(new NineFragment(), "NINE"); 
    adapter.addFrag(new TenFragment(), "TEN"); 
    viewPager.setAdapter(adapter); 
} 

private class ViewPagerAdapter extends FragmentPagerAdapter { 
    private final List<Fragment> mFragmentList = new ArrayList<>(); 
    private final List<String> mFragmentTitleList = new ArrayList<>(); 

    public ViewPagerAdapter(FragmentManager manager) { 
     super(manager); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return mFragmentList.get(position); 
    } 

    @Override 
    public int getCount() { 
     return mFragmentList.size(); 
    } 

    public void addFrag(Fragment fragment, String title) { 
     mFragmentList.add(fragment); 
     mFragmentTitleList.add(title); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return mFragmentTitleList.get(position); 
    } 
} 
} 

activity_scrollable_tabs.xml

<android.support.design.widget.CoordinatorLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<android.support.design.widget.AppBarLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="?attr/colorPrimary" 
     app:layout_scrollFlags="scroll|enterAlways" 
     app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> 

    <android.support.design.widget.TabLayout 
     android:id="@+id/tabs" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:tabMode="scrollable"/> 
</android.support.design.widget.AppBarLayout> 

<android.support.v4.view.ViewPager 
    android:id="@+id/viewpager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 
</android.support.design.widget.CoordinatorLayout> 

OneFragment.java

package info.androidhive.materialtabs.fragments; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

import info.androidhive.materialtabs.R; 


public class OneFragment extends Fragment{ 

public OneFragment() { 
    // Required empty public constructor 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    return inflater.inflate(R.layout.fragment_one, container, false); 
} 

} 

fragment_one.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context="info.androidhive.materialtabs.fragments.OneFragment"> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/one" 
    android:textSize="40dp" 
    android:textStyle="bold" 
    android:layout_centerInParent="true"/> 
    </RelativeLayout> 

第二和第三片段代碼與提及的第一代碼相同。我只是在第三個選項卡的代碼添加以下代碼onCreateView方法

Toast.makeText(getContext(), "3 fragment", Toast.LENGTH_SHORT).show(); 
    Log.d(TAG, "onCreateView: 3 fragment "); 

我得到下面的輸出

Output

,你可以展示片段3吐司來在第二個片段我也注意到第三個片段對數貓也來第二個片段。我不知道發生了什麼錯,但我注意到我在當前Tab位置即將到來的Tab Toast和登錄貓 顯示,並且它會在tablayout選項卡上的任何位置發生。我也嘗試其他教程和其他方法來創建可滾動的Tablayout,但在所有實踐中,我都會遇到同樣類型的問題。請幫我解決問題,我只是想我的即將到來的片段不能開始進行,直到我訪問。最後抱歉牀格式我是新手。

+0

第二和第三片段的代碼是一樣的提製表1碼。我只是在第三個標籤代碼添加以下代碼onCreateView方法 吐司。makeText(getContext(),「3 fragment」,Toast.LENGTH_SHORT).show(); Log.d(TAG,「onCreateView:3 fragment」); – Basit

+0

試試這個https://stackoverflow.com/a/19027096/6834114 – Omi

回答

0

FragmentPagerAdapter在使用之前創建下一個片段的實例。 Fragment的部分生命週期在Fragment附加到窗口之前被調用,並且是可見的。 從Android的文檔的一些信息約FragmentPagerAdapter說:

PagerAdapter的實施表示每個頁面被永久保存在片段經理只要用戶可以返回頁面片段。

用戶訪問的每個頁面的片段都將保存在內存中,儘管其視圖層次結構在不可見時可能會被破壞。

這不是一個充分的信息,但基本上它說,這些方法onCreateView()onDestroyView()不直接與該片用戶的可見性連接,所以最好考慮一下把你的代碼在onResume()例如或請使用viewPager.addOnPageChangeListener()獲取有關頁面更改的信息。

+0

我知道'viewPager.addOnPageChangeListener()'和'tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener()'我正在使用此方法獲得正確的標籤位置,但我對這種做法的擔心是爲什麼我從當前標籤頁中獲取即將到來的標籤數據。 – Basit

+0

以及如何停止繼續前進標籤,直到我沒有在此標籤處訪問過 – Basit

+0

@Basit,正如我所說的,創建了下一個Fragment(s) ,之前他們可見,所以onCreateView()調用較早,而你仍然在以前的選項卡 – Galya

0

您可以查看當前選中的標籤

@Override 
public void setUserVisibleHint(boolean isVisibleToUser) { 
    super.setUserVisibleHint(isVisibleToUser); 
    if (isVisibleToUser) { 
     // Show your toast here 
    } 
} 

您可以使用此方法來知道當前顯示的選項卡

+0

我知道如何獲得正確的選項卡的位置,但我對這種做法的關注是爲什麼我得到我即將從當前標籤數據\t 以及如何停止繼續前進標籤,直到我沒有在此標籤訪問 – Basit

+0

你不能停止,而是你在onCreateView()中調用的代碼,你可以轉移到這種方法來防止它。 – Neha

相關問題