介绍

我有一个Book的活动,其中包含一个类型为“page”的arraylist,并处理我决定使用FragmentStatePagerAdapter的所有页面,其中我的一个片段包含一个页面.

我为寻呼机中的每个片段和父活动之间的通信创建了一个接口.我在这个接口中需要的方法是更新页面中显示的页面,所以我为父活动创建了工具,用于从片段接收​​数据的接口并将它们存储在页面中以保存在arraylist中.

每个片段都有一个EditText,用户可以在其中编写,我设置addTextChangedListener来捕获用户停止写入的时刻.

当用户停止在EditText中写入时,在onTextChanged()中,我调用activity father中实现的函数.

这是我的活动代码

public class BookEditorActivity implements BookEditorFragment.EditorFrToEditorActInterface {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.book_editor_activity);

Bundle extras = getIntent().getExtras();

b = (Book) extras.get("book");

setBookViewPager(b);

}

private void setBookViewPager(Book b) {

mBookViewPager = (ViewPager) findViewById(R.id.book_editor_pager);

mBookViewPagerAdapter = new BookViewPagerAdapter(getSupportFragmentManager(), b);

mBookViewPager.setAdapter(mBookViewPagerAdapter);

}

@Override

public void saveBookPageTextContent(String textContent) {

int current = mBookViewPager.getCurrentItem();

if (b.getPages().get(current) instanceof BookPageText) {

((BookPageText) b.getPages().get(current)).setContentPageText(textContent);

}

}

@Override

public void newBookPageText() {

int current = mBookViewPager.getCurrentItem();

BookPageText bookPageText = new BookPageText();

bookPageText.setContentPageText("");

b.getPages().add(b.getPages().size() - 1, bookPageText);

setIndicator(current + 1, b.getPages().size());

mBookViewPagerAdapter.notifyDataSetChanged();

}

}

这是片段代码

public class BookEditorFragment extends Fragment {

private EditorFrToEditorActInterface mCallback;

public interface EditorFrToEditorActInterface {

void newBookPageText();

void saveBookPageTextContent(String s);

}

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

Bundle pageContent = getArguments();

if (pageContent != null) {

page = pageContent.getParcelable("page");

}

}

@Nullable

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

if (page instanceof BookPageText) {

BookPageText bookPage = (BookPageText) page;

mView = inflater.inflate(R.layout.book_page_text_fragment, container, false);

contentPage = (EditText) mView.findViewById(R.id.content_text);

String contentPageText = bookPage.getContentPageText();

contentPage.setText(contentPageText.isEmpty() ? "" : Html.fromHtml(contentPageText));

contentPage.addTextChangedListener(new TextWatcher() {

public void onTextChanged(CharSequence c, int start, int before, int count) {

mCallback.saveBookPageTextContent(c.toString());

}

public void beforeTextChanged(CharSequence c, int start, int count, int after) {

}

public void afterTextChanged(Editable c) {

}

});

}

return mView;

}

@Override

public void onAttach(Context context) {

super.onAttach(context);

try {

mCallback = (EditorFrToEditorActInterface) context;

} catch (ClassCastException e) {

throw new ClassCastException(context.toString()

+ " must implement NewPageInterface");

}

}

@Override

public void onDetach() {

mCallback = null;

super.onDetach();

}

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.editor_new_text:

mCallback.newBookPageText();

break;

}

}

}

这是FragmentStatePagerAdapter代码

public class BookViewPagerAdapter extends FragmentStatePagerAdapter {

private ArrayList bookPages = new ArrayList<>();

private final SparseArray> instantiatedFragments = new SparseArray<>();

public BookViewPagerAdapter(FragmentManager fm, Book b) {

super(fm);

this.bookPages = b.getPages();

}

@Override

public Fragment getItem(int position) {

Object page = bookPages.get(position);

Bundle pageContent = new Bundle();

if (page instanceof BookPageText) {

BookPageText bookPageText = (BookPageText) page;

pageContent.putParcelable("page", bookPageText);

}

BookEditorFragment fragment = new BookEditorFragment();

fragment.setArguments(pageContent);

return fragment;

}

@Override

public int getCount() {

return bookPages.size();

}

@Override

public Object instantiateItem(final ViewGroup container, final int position) {

final BookEditorFragment fragment = (BookEditorFragment) super.instantiateItem(container, position);

instantiatedFragments.put(position, new WeakReference<>(fragment));

return fragment;

}

@Override

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

instantiatedFragments.remove(position);

super.destroyItem(container, position, object);

}

@Nullable

public Fragment getFragment(final int position) {

final WeakReference wr = instantiatedFragments.get(position);

if (wr != null) {

return wr.get();

} else {

return null;

}

}

@Override

public int getItemPosition(Object object) {

int position = bookPages.indexOf(object);

return position == -1 ? POSITION_NONE : position;

}

}

由于代码长度,我删除了一些部分,如onClickListener,onPageSelectionListener和我正在创建的其他类型的页面.

问题

这个逻辑似乎工作正常,但每次我修改片段中EditText的内容时,左边的close片段也会更新,我不知道为什么.

0e1b0410861a4daabb790811952f98a3.png

正如你在图像中看到的那样,如果我在EditText2中写一些东西,EditText1中会出现相同的内容,这没有任何意义.

另一个问题是,当我在书中添加新页面时,页面是正确创建的,但是使用上一页的内容,这没有任何意义. (再次!)

我的尝试

1)我试图捕获onFocusChange而不是使用addTextChangedListener,但没有改变.

2)我尝试使用onChangePageListener()实现不同的逻辑,但在这种情况下,我松开了mBookViewPager.getCurrentItem(),因此更新出错了.

3)我尝试了所有这些帖子:one,two,three和four.

我怎样才能纠正这种奇怪的行为?

是否有可能问题出现在我引用本书ArrayList中的页面的方式中?

谢谢

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐