EinführungSpeichern/Aktualisieren Fragment des EditText Daten in einem FragmentStatePagerAdapter
ich eine Aktivität mit einem Buch, das eine Arraylist vom Typ „Seite“ enthält und alle Seiten zu umgehen habe ich beschlossen, eine FragmentStatePagerAdapter zu verwenden, in dem ein meines Fragments enthält eine Seite.
Ich habe eine Schnittstelle für die Kommunikation zwischen jedem Fragment in dem Pager und der Vater Aktivität. Die Methode, die ich in dieser Schnittstelle müssen, ist für die Aktualisierung einer Seite in einem Fragment zeigte, so dass ich für den Empfang der Daten von einem Fragment zum Vater Aktivität, die Schnittstelle implementieren und speichern sie in einer Seite in der Arraylist zu speichern.
Jedes Fragment hat eine EditText in dem der Benutzer schreiben kann, und ich setzte einen addTextChangedListener den Moment zu erwischen, wenn der Benutzer schreiben stoppt. Wenn der Benutzer aufhört, in der EditText im OnTextChanged() zu schreiben, rufe ich die Funktion in der Tätigkeit Vater umgesetzt.
Dies ist mein Aktivitätscode
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();
}
}
Dieses das Fragment-Code ist
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;
}
}
}
Dies ist der FragmentStatePagerAdapter Code
public class BookViewPagerAdapter extends FragmentStatePagerAdapter {
private ArrayList<Object> bookPages = new ArrayList<>();
private final SparseArray<WeakReference<BookEditorFragment>> 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<BookEditorFragment> 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;
}
}
Aufgrund der Codelänge ich einige Teile entfernt sind wie die OnClickListener, onPageSelectionListener und andere Arten von Seiten, die ich Recht habe die Schaffung jetzt.
Das Problem
Diese Logik richtig zu funktionieren scheint, aber jedes Mal, dass ich das den Inhalt eines EditText in einem Fragmente ändern wissen, das nahe Fragment nach links wird ebenfalls aktualisiert und ich weiß nicht Warum.
Wie Sie im Bild sehen kann, wenn ich etwas in der EditText2 schreiben, wird der gleiche Inhalt in der EditText1 erscheinen und das macht keinen Sinn.
Ein weiteres Problem ist, wenn ich eine neue Seite im Buch hinzufügen, wird die Seite korrekt erstellt, aber mit dem Inhalt der vorherigen Seite und das macht keinen Sinn. (Wieder!)
Meine Versuche
1) Ich habe versucht, die onFocusChange anstatt die addTextChangedListener zu fangen, aber nichts geändert.
2) Ich habe versucht, eine andere Logik mit der onChangePageListener()
zu implementieren, aber in diesem Fall verliere ich die mBookViewPager.getCurrentItem()
, so dass das Update schief geht.
3) Ich habe dies alle diese Beiträge versucht: one, two, three und four.
Wie kann ich dieses seltsame Verhalten zu korrigieren? Ist es möglich, dass das Problem in der Art ist, wie ich auf die Seiten in der ArrayList des Buches referenziere?
Dank
Können Sie Link zu Ihrem Code bereitzustellen. Es ist schwer zu replizieren mit dem von Ihnen zur Verfügung gestellten Code –