【问题标题】:Pass Google API client object from activity to sliding tabs fragment将 Google API 客户端对象从活动传递到滑动选项卡片段
【发布时间】:2016-06-10 05:56:25
【问题描述】:

我正在尝试将一个对象从一个活动传递到一个滑动选项卡片段。我在片段中使用带有 Bundle、Serializable 和 args 的 newInstance 方法,但我的问题是我应该如何以及在何处调用此方法。提前致谢。

主活动

public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

GoogleApiClient apiClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    apiClient = new GoogleApiClient.Builder(this)
            .addApi(Drive.API)
            .addScope(Drive.SCOPE_APPFOLDER)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
    tabLayout.addTab(tabLayout.newTab().setText("Tab1"));
    tabLayout.addTab(tabLayout.newTab().setText("Tab2"));
    tabLayout.addTab(tabLayout.newTab().setText("Tab3"));
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

    final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
    final PageAdapter adapter = new PageAdapter
            (getSupportFragmentManager(), tabLayout.getTabCount());
    viewPager.setAdapter(adapter);
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    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) {

        }
    });


}

页面适配器

public class PageAdapter extends FragmentStatePagerAdapter {
int mNumOfTabs;


public PageAdapter(FragmentManager fm, int NumOfTabs) {
    super(fm);
    this.mNumOfTabs = NumOfTabs;
}

@Override
public Fragment getItem(int position) {

    switch (position) {
        case 0:
            ValidTab tab1 = new ValidTab();
            return tab1;
        case 1:
            ExpiredTab tab2 = new ExpiredTab();
            return tab2;
        case 2:
            AllTab tab3 = new AllTab();
            return tab3;
        default:
            return null;
    }
}


@Override
public int getCount() {
    return mNumOfTabs;
}

有效标签

public class ValidTab extends Fragment {

DatabaseHelper db;
Button pick_buy_date, pick_exp_date, save, sync;
TextView buy_date, exp_date;
EditText et_name,et_shop,et_note;
int type;
private static final String DESCRIBABLE_KEY = "gapiclient";
private GoogleApiClient googleApiClient;

public static ValidTab newInstance(GoogleApiClient gApiclient){
    ValidTab validTab = new ValidTab();
    Bundle bundle = new Bundle();
    bundle.putSerializable(DESCRIBABLE_KEY, (Serializable) gApiclient);
    validTab.setArguments(bundle);
    return validTab;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    googleApiClient = (GoogleApiClient) getArguments().getSerializable(DESCRIBABLE_KEY);
    View rootView = inflater.inflate(R.layout.valid_tab, container, false);
    return rootView;
}

【问题讨论】:

    标签: android android-fragments android-tablayout


    【解决方案1】:

    在这里你可以这样使用它

    final PageAdapter adapter = new PageAdapter
                (getSupportFragmentManager(), tabLayout.getTabCount(),apiClient );
    

    在pageradapter类中

    GoogleApiClient apiClient;
    public PageAdapter(FragmentManager fm, int NumOfTabs,GoogleApiClient apiClient) {
        super(fm);
        this.mNumOfTabs = NumOfTabs;
        this.apiClient=apiClient;
    }
    

    和

    switch (position) {
            case 0:
    
                return ValidTab.newIntance(gApiclient);
            case 1:
    
                return ExpiredTab.newIntance(gApiclient);
            case 2:
    
                return AllTab.newIntance(gApiclient);
            default:
                return null;
        }
    

    最好的方法是这样

    public class ApplicationClass extends Application
    {
        //instantiate object public static
        public static GoogleApiClient mGoogleApiClient;
        public Context mContext;
    
        @Override
        public void onCreate()
        {
            super.onCreate();
            mContext = getApplicationContext();
    
            mGoogleApiClient = new GoogleApiClient.Builder(mContext)
                .addConnectionCallbacks(mContext)
                .addOnConnectionFailedListener(mContext)
                .addApi(Games.API).addScope(Games.SCOPE_GAMES)
                // add other APIs and scopes here as needed
                .build();
        }
    
        @Override
        public void onTerminate()
        {
            super.onTerminate();
        }
    }
    

    你的片段类

    private GoogleApiClient googleApiClient;
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    
            View rootView = inflater.inflate(R.layout.valid_tab, container, false);
     googleApiClient = ApplicationTest.mGoogleApiClient;
            return rootView;
        }
    

    【讨论】:

    • 好的,我认为你的方法是可行的,但现在我得到一个无法转换的错误:undle.putSerializable(DESCRIBABLE_KEY, (Serializable) gApiclient);有什么想法吗?
    • 你需要正确实现可序列化
    • 立即查看答案
    • 好的,所以基于你的更新我不应该在 PageAdapter 类中调用 newInstance 方法?只需返回一个 ValidTab tab = new ValidTab() ?
    【解决方案2】:

    正确的位置应该在适配器的 getItem() 方法中 -

    ValidTab tab1 = new ValidTab();
    //add arguments to fragment here
    return tab1;
    

    要在适配器中获取数据,可以在 Activity 中初始化适配器时通过构造函数传递数据,或者在适配器中创建公共方法并通过从 Activity 调用该方法来传递该方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多