На самом деле это проблема, возникшая откуда-то еще, но я сузил ее до следующего сценария. В моей MainActivity я использую ViewPager, чтобы иметь три вкладки внизу для переключения между моими тремя фрагментами. Если я нажимаю кнопку, чтобы перейти к новому действию после перехода к любому фрагменту, я получаю следующую ошибку:
FATAL EXCEPTION: main
java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 861520 bytes
at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3752)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
Caused by: android.os.TransactionTooLargeException: data parcel size 861520 bytes
at android.os.BinderProxy.transactNative(Native Method)
at android.os.BinderProxy.transact(Binder.java:615)
at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:3606)
at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3744)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
Однако, если я нажму кнопку перед перемещением между различными фрагментами в ViewPager, у меня не произойдет сбой. Я изучил все возможности сделать свои фрагменты просто полностью пустыми, чтобы увидеть, кроется ли проблема в этом, но, похоже, она связана с MainActivity или FragmentStatePagerAdapater.
Вот код для них обоих:
import android.content.Intent;
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.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import com.mypackage.Fragments.GroupsFragment;
import com.mypackage.Fragments.HomeFragment;
import com.mypackage.Fragments.ProfileFragment;
import com.mypackage.R;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Get the ViewPager and set it's PagerAdapter so that it can display items
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
viewPager.setAdapter(new MainFragmentPagerAdapter(getSupportFragmentManager()));
// Give the TabLayout the ViewPager
TabLayout tabLayout = (TabLayout) findViewById(R.id.sliding_tabs);
tabLayout.setupWithViewPager(viewPager);
Button mTestButton = (Button) findViewById(R.id.test);
mTestButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
moveToGroupActivity();
}
});
}
public void moveToGroupActivity() {
Intent myIntent = new Intent(this, GroupActivity.class);
startActivity(myIntent);
}
public static class MainFragmentPagerAdapter extends FragmentStatePagerAdapter {
final int PAGE_COUNT = 3;
private String tabTitles[] = new String[] { "Home", "Groups", "Profile" };
public MainFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return PAGE_COUNT;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return HomeFragment.newInstance();
case 1:
return GroupsFragment.newInstance();
case 2:
return ProfileFragment.newInstance();
default:
return null;
}
}
@Override
public CharSequence getPageTitle(int position) {
// Generate title based on item position
return tabTitles[position];
}
}
}
Чтобы было ясно: у меня есть кнопка, которая переходит к другому действию в действии, состоящем из ViewPager, который перемещается между тремя фрагментами. Если я нажму кнопку перед тем, как перейти к другому фрагменту, он загрузится нормально. Если я перейду к фрагменту, а затем нажму кнопку, я получу указанный выше сбой.
Я никогда не использую onSaveInstanceState() или что-то в этом роде. Мое единственное предположение состоит в том, что FragmentStatePagerAdapter помещает фрагменты в память и вызывает сбой, но я действительно не знаю.