私はViewPagerとPagerTabStripでMainActivityを持っています。私はまた、SettingsFragmentとMyFragmentStatePagerAdapterを持っています。私はフラグメントを削除することに問題があったので、私は今持っているもので終わるためにいくつかのことを試みました。フラグメントを削除するまで、フラグメントを追加することは問題ではありません。フラグメントを追加するには、「+」をクリックし、フラグメントを削除するには、フラグメント内のボタンをクリックします。ViewPagerに追加されたフラグメントは空白です
たとえば、フラグメント「1」と「2」を追加するとします。それから、フラグメント "1"を削除して、 "2"を残します。私が "+"をクリックするまで、すべてはうまくいきます。新しいタブとページが追加されますが、フラグメントが存在する空白のページが表示されます。もう一度クリックすると、このエラーが発生します。
java.lang.IndexOutOfBoundsException: Invalid index 3, size is 3
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
at java.util.ArrayList.get(ArrayList.java:308)
at com.angelwing.homebase.MyFragmentStatePagerAdapter.getPageTitle(MyFragmentStatePagerAdapter.java:41)
at android.support.v4.view.PagerTitleStrip.updateText(PagerTitleStrip.java:282)
at android.support.v4.view.PagerTitleStrip.updateTextPositions(PagerTitleStrip.java:341)
at android.support.v4.view.PagerTabStrip.updateTextPositions(PagerTabStrip.java:290)
at android.support.v4.view.PagerTitleStrip$PageListener.onPageScrolled(PagerTitleStrip.java:493)
at android.support.v4.view.ViewPager.dispatchOnPageScrolled(ViewPager.java:1955)
at android.support.v4.view.ViewPager.onPageScrolled(ViewPager.java:1924)
at android.support.v4.view.ViewPager.pageScrolled(ViewPager.java:1862)
at android.support.v4.view.ViewPager.computeScroll(ViewPager.java:1822)
at android.view.View.updateDisplayListIfDirty(View.java:16451)
at android.view.View.draw(View.java:17238)
at android.view.ViewGroup.drawChild(ViewGroup.java:3923)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3713)
at android.view.View.updateDisplayListIfDirty(View.java:16459)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3907)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3887)
at android.view.View.updateDisplayListIfDirty(View.java:16424)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3907)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3887)
at android.view.View.updateDisplayListIfDirty(View.java:16424)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3907)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3887)
at android.view.View.updateDisplayListIfDirty(View.java:16424)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3907)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3887)
at android.view.View.updateDisplayListIfDirty(View.java:16424)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3907)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3887)
at android.view.View.updateDisplayListIfDirty(View.java:16424)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:325)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:331)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:366)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:3134)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2933)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2522)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1437)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7397)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:920)
at android.view.Choreographer.doCallbacks(Choreographer.java:695)
at android.view.Choreographer.doFrame(Choreographer.java:631)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:906)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7224)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
アダプターのリストにある項目を追加したり削除したりするだけで、なぜこのような問題が起こっているのか分かりません。私のMainActivityとMyFragmentStatePagerAdapterのコードは次のとおりです。
MyFragmentStatePagerAdapter
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.PagerAdapter;
import android.util.Log;
import java.util.ArrayList;
public class MyFragmentStatePagerAdapter extends FragmentStatePagerAdapter
{
private ArrayList<SettingsFragment> fragmentList = new ArrayList<>();
private ArrayList<String> fragmentTitleList = new ArrayList<>();
public MyFragmentStatePagerAdapter(FragmentManager fm)
{
super(fm);
}
public void addFragment(SettingsFragment f, String title)
{
fragmentList.add(f);
fragmentTitleList.add(title);
}
public void deleteFragment (int pos)
{
fragmentList.remove(pos);
fragmentTitleList.remove(pos);
}
@Override
public Fragment getItem(int position)
{
return fragmentList.get(position);
}
@Override
public CharSequence getPageTitle(int position)
{
return fragmentTitleList.get(position);
}
@Override
public int getCount()
{
return fragmentList.size();
}
public void setPageTitle(int pos, String pageTitle)
{
fragmentTitleList.set(pos, pageTitle);
}
@Override
public int getItemPosition(Object object)
{
int position = fragmentList.indexOf(object);
if (position == -1)
return POSITION_NONE;
return position;
// return fragmentList.indexOf(object);
}
}
MainActivity
public class MainActivity extends AppCompatActivity
{
SharedPreferences sp;
private ViewPager viewPager;
private MyFragmentStatePagerAdapter adapter;
Set<String> baseNames;
final int MY_PERMISSIONS_ACCESS_FINE_LOCATION = 1001;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sp = getSharedPreferences("com.angelwing.homebase", Context.MODE_PRIVATE);
////// [Request Permissions] //////
// if permission hasn't been granted yet, request permission
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)
{
ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_ACCESS_FINE_LOCATION);
}
viewPager = (ViewPager) findViewById(R.id.viewPager);
adapter = new MyFragmentStatePagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(adapter);
// Get number of names
// Add those fragments
adapter.startUpdate(viewPager);
addFragments();
adapter.finishUpdate(viewPager);
AdView bannerAd = (AdView) findViewById(R.id.bannerAd);
bannerAd.loadAd(new AdRequest.Builder().build());
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}
public void addFragments()
{
baseNames = sp.getStringSet("baseNames", new HashSet<String>());
SettingsFragment settingsFragment;
if (baseNames.isEmpty())
{
settingsFragment = new SettingsFragment();
settingsFragment.setIsNew(true);
settingsFragment.setName("");
settingsFragment.setWifi(false);
settingsFragment.setData(false);
settingsFragment.setBluetooth(false);
settingsFragment.setVolume(true);
settingsFragment.setVolumeValue(50);
settingsFragment.setVibrate(false);
adapter.addFragment(settingsFragment, "New Base");
}
else
{
for (String baseName : baseNames)
{
Log.i("Settings", "baseName: " + baseName);
settingsFragment = new SettingsFragment();
settingsFragment.setIsNew(false);
settingsFragment.setName(baseName);
settingsFragment.setWifi(sp.getBoolean(baseName + "wifi", false));
settingsFragment.setData(sp.getBoolean(baseName + "data", false));
settingsFragment.setBluetooth(sp.getBoolean(baseName + "bluetooth", false));
settingsFragment.setVolume(sp.getBoolean(baseName + "volume", false));
settingsFragment.setVolumeValue(sp.getInt(baseName + "volumeValue", 50));
settingsFragment.setVibrate(sp.getBoolean(baseName + "vibrate", false));
adapter.addFragment(settingsFragment, baseName);
}
}
adapter.notifyDataSetChanged();
}
public void deleteFragment(int pos)
{
adapter.startUpdate(viewPager);
adapter.deleteFragment(pos);
adapter.notifyDataSetChanged();
adapter.finishUpdate(viewPager);
}
public MyFragmentStatePagerAdapter getAdapter()
{
return adapter;
}
public ViewPager getViewPager()
{
return viewPager;
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.mymenu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected (MenuItem item)
{
Set<String> bN = sp.getStringSet("baseNames", new HashSet<String>());
baseNames = new HashSet<>(bN);
if (item.getItemId() == R.id.addButton)
{
SettingsFragment settingsFragment = new SettingsFragment();
settingsFragment.setIsNew(true);
settingsFragment.setName("");
settingsFragment.setWifi(false);
settingsFragment.setData(false);
settingsFragment.setBluetooth(false);
settingsFragment.setVolume(true);
settingsFragment.setVolumeValue(50);
settingsFragment.setVibrate(false);
adapter.startUpdate(viewPager);
adapter.addFragment(settingsFragment, "New Base");
adapter.notifyDataSetChanged();
adapter.finishUpdate(viewPager);
viewPager.setCurrentItem(adapter.getCount() - 1);
return true;
}
return super.onOptionsItemSelected(item);
}
}
同じ問題です、私は恐れています。 – Katie