将 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 客户端对象从活动传递到滑动选项卡片段的主要内容,如果未能解决你的问题,请参考以下文章