2016-02-26 2 views
0

Я пытаюсь передать объект из одного действия в скользящий фрагмент вкладки. Я использую метод newInstance с Bundle, Serializable и args в моем фрагменте, но моя проблема заключается в том, как и где я должен называть этот метод. Заранее спасибо.Пропустить клиентский объект API Google от активности до скользящих вкладок.

MainActivity

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) { 

     } 
    }); 


} 

PageAdapter

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; 
} 

ValidTab

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; 
} 
+0

проверить мой ответ –

ответ

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; 
    } 
+0

Хорошо, я думаю, что ваш способ работает, но теперь я получаю сообщение об ошибке не в строке: unle.putSerializable (DESCRIBABLE_KEY, (Serializable) gApiclient); Любая идея? –

+0

u нужно сделать правильную реализацию сериализуемого –

+0

проверить ответ –

0

Правильное место было бы в вашемМетод адаптера GetItem() -

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

Чтобы получить данные в вашем адаптере, либо передать его через конструктор при инициализации адаптера в деятельности или создать публичный метод в адаптере и пройти через этот метод по телефону это от вашей деятельности.

Смежные вопросы