android - फ्रैगमेंटस्टेट पेज एडेप्टर में टुकड़े के संपादन टेक्स्ट को सहेजें/अपडेट करें



android-fragments android-viewpager (1)

परिचय

मेरे पास एक पुस्तक के साथ एक गतिविधि है जिसमें "पेज" प्रकार की एक सरणी सूची होती है और मैं उन सभी पृष्ठों को संभालता हूं जो मैंने एक फ्रैगमेंटस्टेट पेजर एडाप्टर का उपयोग करने का निर्णय लिया था जिसमें मेरे एक टुकड़ा में एक पृष्ठ होता है।

मैंने पेजर और पिता गतिविधि में हर टुकड़े के बीच संचार के लिए इंटरफ़ेस बनाया है। इस इंटरफ़ेस में मुझे जिस पद्धति की ज़रूरत है, एक पृष्ठ को अद्यतन करने के लिए एक टुकड़े में दिखाया गया है, इसलिए मैंने अपने पिता गतिविधि को लागू किया, एक टुकड़ा से डेटा प्राप्त करने के लिए इंटरफ़ेस और सरणी सूची में सहेजने के लिए उन्हें किसी पृष्ठ में संग्रहीत किया।

हर टुकड़ा में एक संपादन टेक्स्ट है जिसमें उपयोगकर्ता लिख ​​सकता है और मैं उस समय को पकड़ने के लिए एक addTextChangedListener सेट करता हूं जब उपयोगकर्ता लिखना बंद हो जाता है। जब उपयोगकर्ता संपादन टेक्स्ट में लिखने के लिए रोकता है, तो ऑन-टच चेंजेड () में, मैं क्रियाकलाप के पिता में कार्यान्वित समारोह को बुलाता हूं।

यह मेरा गतिविधि कोड है

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;
        }
    }

}

यह फ्रैगमेंटस्टेटपेगर एडाप्टर कोड है

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;
    }
}

कोड की लंबाई के कारण मैंने कुछ भागों जैसे onClickListener, onPageSelectListener और अन्य प्रकार के पृष्ठों को हटा दिया है जो अभी मैं बना रहा हूं।

समस्या

यह तर्क ठीक से काम करता है, लेकिन हर बार जब मैं किसी टुकड़े में एक संपादन टेक्स्ट की सामग्री को संशोधित करता हूं, तो बाईं तरफ के करीबी हिस्से को भी अपडेट किया जाता है और मुझे नहीं पता कि क्यों


जैसा कि आप छवि में देख सकते हैं, अगर मैं EditText2 में कुछ लिखता हूं, तो उसी सामग्री को EditText1 में दिखाई देगा और यह कोई मतलब नहीं होगा।

एक और समस्या यह है कि जब मैं किताब में एक नया पृष्ठ जोड़ता हूं, तो पेज सही तरीके से बनाया जाता है, लेकिन पिछले पृष्ठ की सामग्री के साथ और यह कोई मतलब नहीं है (फिर!)

मेरा प्रयास

1) मैं addTextChangedListener का उपयोग करने के बजाय onFocusChange को पकड़ने की कोशिश की, लेकिन कुछ भी नहीं बदला

2) मैं mBookViewPager.getCurrentItem() का उपयोग कर एक अलग तर्क को लागू करने की कोशिश की, लेकिन इस मामले में मैं mBookViewPager.getCurrentItem() खो देता mBookViewPager.getCurrentItem() ताकि अद्यतन गलत हो जाता है

3) मैंने इन सभी पदों की कोशिश की: एक , दो , तीन और चार

मैं इस अजीब व्यवहार को कैसे ठीक कर सकता हूं? क्या यह संभव है कि इस समस्या के मुताबिक मैं पुस्तक के सरणी सूची में पृष्ठों को संदर्भित करता हूं?

धन्यवाद


आपके संभावित असफलता में मुझे कुछ संभव त्रुटि मिलती है

  1. वर्तमान पृष्ठ स्थिति प्रबंधन को लागू करने के लिए

     mViewPager.setOnPageChangeListener(new OnPageChangeListener() {
                @Override
                public void onPageSelected(int p) {
                current = p;
                Log.e("Postion", "" + p);
                }
    
                @Override
                public void onPageScrolled(int arg0, float arg1, int arg2) {}
    
                @Override
                public void onPageScrollStateChanged(int arg0) {}
            });
  2. व्यूअर अपने आप को निजी और अगले दृश्य को निजी तौर पर लोड कर लेता है यह पेजर को सेट करता है, मैथोड को कॉल करके ऑफिसस्क्रीन पेज सेट करें

    mViewPager.setOffscreenPageLimit();
  3. हमेशा यह सुनिश्चित करें कि यदि आप एडाप्टर में if कथन का उपयोग कर रहे हैं, तो आपको किसी भी डिफ़ॉल्ट मान के लिए हमेशा इसका else भाग के माध्यम से इसका काउंटर भाग रखना चाहिए।

    if (page instanceof BookPageText) {
        BookPageText bookPageText = (BookPageText) page;
        pageContent.putParcelable("page", bookPageText);
    }




fragmentstatepageradapter