繁体   English   中英

切换标签时从片段保存数据

[英]Save data from fragments when switching tabs

我编写了一个游戏,用户输入玩家人数,每个玩家都有一个带有空表的选项卡。

因此,我使用了PagerAdapterClass (扩展了FragmentStatePagerAdapter )和viewpager 因此,每个玩家都具有相同的fragmentView

现在,用户可以将变量放入表中,每次我在选项卡之间切换时,输入都会丢失。 好吧,我通过将其添加到我的pageradapter中来“解决”该问题:

@Override
    public void destroyItem(ViewGroup container, int position, Object object) {

    }

但这要比实际保存数据更能阻止viewpager被破坏。

that stuff in that table. 我的主要目标是这些内容在该表中。

我已经尝试过https://stackoverflow.com/a/17135346/11956040但我无法获得mContent,因为我无法获取片段的引用,因为并非所有片段都是单独创建的,而是同时创建的(或类似的东西)那)。

我也不知道如何设置标签。 这种方式: https : //stackoverflow.com/a/18993042/11956040对我不起作用。

主要活动:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game);
        Toolbar toolbar = findViewById(R.id.toolbar2);
        setSupportActionBar(toolbar);

        ...

        //numPlayer = num of tabs
        SectionsPagerAdapter adapter = new SectionsPagerAdapter(numPlayer, getSupportFragmentManager());

        ViewPager viewPager = findViewById(R.id.view_pager);
        viewPager.setAdapter(adapter);

        TabLayout tabs = findViewById(R.id.tabs);
        tabs.setupWithViewPager(viewPager);
        if(numPlayer >= 5) {
            tabs.setTabMode(TabLayout.MODE_SCROLLABLE);
        }
    }

PagerAdapter:

public class SectionsPagerAdapter extends FragmentStatePagerAdapter {

    private int tabNum;

    public SectionsPagerAdapter(int tabNum, FragmentManager fm) {
        super(fm);
        this.tabNum = tabNum;
    }

    @Override
    public PlaceholderFragment getItem(int position) {
        return PlaceholderFragment.newInstance(position);
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        int playerNum = position + 1;
        return "Spieler " + playerNum;
    }

    @Override
    public int getCount() {
        // Show 2 total pages.
        return tabNum;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {

    }
}

分段:

public static PlaceholderFragment newInstance(int index) {
        PlaceholderFragment fragment = new PlaceholderFragment();
        Bundle bundle = new Bundle();
        bundle.putInt("player", index);
        fragment.setArguments(bundle);
        return fragment;
    }

必须有解决方案,但我找不到或无法实现。 请帮助。

这样解决了我的问题:

  1. 为行和列定义二维ArrayList,为列定义计数器:
    private ArrayList<ArrayList<Integer>> columnArray; 
    private int column;
  1. onCreateView (用于片段)将column = 0设置column = 0 ,并将一个带有空列表的条目添加到columnArray并在rowList的列索引上设置第一个columnArray
pointArray.add(column, new ArrayList<Integer>());
final ArrayList<Integer> rowList = pointArray.get(column);
  1. 用0填充空的rowList (也许它也可以通过其他方式工作,但是我这样做是为了在空的EditTexts上使用0并可以轻松地替换它们)

  2. 为所有EditText定义View.OnFocusChangeListener ,如下所示:

/*I dont know if I could set column final in general, 
but you need to set a final int because you call this value in an inner class*/

final int pos = column 

for (int i = 0; i <= getEditTexts(pos).size() - 1; i++) {
EditText editTexts = getEditTexts(pos).get(i);
final String editTextsTag = editTexts.getTag().toString();

View.OnFocusChangeListener listener = new View.OnFocusChangeListener() {
   @Override
   public void onFocusChange(View view, final boolean b) {
      if (view.getTag().toString().equals(editTextsTag) && !b) {
        //fills rowList
        addEntries(pos, rowList);

        //adds rowList to columnArray
        columnArray.set(pos, rowList);

        //save the columnsArray or use it 
        saveData(columnArray);
      }
   }
};
editTexts.setOnFocusChangeListener(listener);
  1. define方法,它根据列位置(pos)从每个单元格收集数据,例如,将其添加到rowList中:
private void addEntries(int pos, ArrayList<Integer> rowList) {
   for(int i = 0; i <= 16; i++) {
      //this requires EditText_label, i made them dynamically
      String edit_label = "edit_" + pos + i; 
      EditText editText = table.findViewWithTag(edit_label);
      String mEditTextString = editText.getText().toString();

      try {
         int thisValue = Integer.parseInt(mEditString);
         rowList.set(j, thisValue);
      } catch (NumberFormatException e) {
         //maybe you do not need this, but I need it for something else
         int thisValue = 0;
         rowList.set(j, thisValue);
      }
   }
}
  1. 定义保存columnArray的方法。 我使用了一个接口将其提供给父活动: 在这里,您可以找到它的创建方式;否则,您可以将columnArray转换为String并将其保存在数据库中。

注意

我通过设置列值来实现它,因为我使用一种方法为运行时添加的每一列增加了值。 如果只有一列,则无需设置。 只需使用0代替pos,column

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM