将 Google API 客户端对象从活动传递到滑动选项卡片段

Posted

技术标签:

【中文标题】将 Google API 客户端对象从活动传递到滑动选项卡片段【英文标题】:Pass Google API client object from activity to sliding tabs fragment 【发布时间】: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;

【问题讨论】:

【参考方案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 调用该方法来传递该方法。

【讨论】:

以上是关于将 Google API 客户端对象从活动传递到滑动选项卡片段的主要内容,如果未能解决你的问题,请参考以下文章

通过意图将地址传递给 Google 地图活动:

在两个活动之间使用相机图像处理意图并将其传递给 Google Maps API 上的标记不起作用

如何将 Bitmap 对象从一个活动传递到另一个活动

如何将不可打包的对象从活动传递到另一个活动?

将对象的嵌套数组列表从适配器传递到活动

使用可序列化将对象从活动传递到活动的正确方法?