在Fragments中设置动态内容时遇到问题



在我的MainActivity中我有一个列表,当一个项目被点击时,我进入我的ScreenSlideActivity。这个活动将从我称为ScreenSlidePageFragment的另一个类中产生一个Fragment,并在我滑动时为我产生一些Fragment。我需要这些片段的内容是唯一的,这取决于我选择的列表中的任何项目。不幸的是,我在这方面没有成功。

我试过在ScreenSlidePageFragment内部创建一个set_all_data(string_data){}函数,并在我创建Fragment之前调用它/更新textView,但我认为我要么得到新的文本的竞争条件,要么我只是做错了,不理解Fragment不够好。


ScreenSlideActivity

package com.example.dgzl.corvegas;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.app.NavUtils;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import org.w3c.dom.Text;
/**
 * Demonstrates a "screen-slide" animation using a {@link ViewPager}. Because {@link ViewPager}
 * automatically plays such an animation when calling {@link ViewPager#setCurrentItem(int)}, there
 * isn't any animation-specific code in this sample.
 *
 * <p>This sample shows a "next" button that advances the user to the next step in a wizard,
 * animating the current screen out (to the left) and the next screen in (from the right). The
 * reverse animation is played when the user presses the "previous" button.</p>
 *
 * @see ScreenSlidePageFragment
 */
public class ScreenSlideActivity extends android.support.v4.app.FragmentActivity {
    /* The number of pages (wizard steps) to show in this demo.*/
    private static final int NUM_PAGES = 3;
    /* The pager widget, which handles animation and allows swiping horizontally to access previous
     * and next wizard steps.*/
    private ViewPager mPager;
    /* The pager adapter, which provides the pages to the view pager widget.*/
    private PagerAdapter mPagerAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_screen_slide);
        // getting intent data
        Intent in = getIntent();
        // Get JSON values from previous intent
        final String biz_data[] = in.getStringArrayExtra("biz_data");

        set_fragment_data(biz_data);
        // Instantiate a ViewPager and a PagerAdapter.
        mPager = (ViewPager) findViewById(R.id.pager);
        mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
        mPager.setAdapter(mPagerAdapter);
        mPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                invalidateOptionsMenu();
            }
        });
    }
    public void onFragClick (View view){
        Toast.makeText(ScreenSlideActivity.this, "button", Toast.LENGTH_SHORT).show();
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        getMenuInflater().inflate(R.menu.activity_screen_slide, menu);
        // enable 'prev' and 'next' when not on first node
        menu.findItem(R.id.action_prev).setEnabled(mPager.getCurrentItem() > 0);
        menu.findItem(R.id.action_next).setEnabled(mPager.getCurrentItem() < (NUM_PAGES-1));
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case 16908332:
                // Navigate "up" the demo structure to the launchpad activity.
                // See http://developer.android.com/design/patterns/navigation.html for more.
                finish();
                return true;
            case R.id.action_prev:
                // Go to the previous step in the wizard. If there is no previous step,
                // setCurrentItem will do nothing.
                mPager.setCurrentItem(mPager.getCurrentItem() - 1);
                return true;
            case R.id.action_next:
                // Advance to the next step in the wizard. If there is no next step, setCurrentItem
                // will do nothing.
                mPager.setCurrentItem(mPager.getCurrentItem() + 1);
                return true;
        }
        return super.onOptionsItemSelected(item);
    }
    /**
     * A simple pager adapter that represents 5 {@link ScreenSlidePageFragment} objects, in
     * sequence.
     */
    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
        public ScreenSlidePagerAdapter(FragmentManager fm) {
            super(fm);
        }
        @Override
        public Fragment getItem(int position) {
            String test_data = "Soem data";
            ScreenSlidePageFragment newFrag = new ScreenSlidePageFragment();
            newFrag.set_all_data(test_data);
            Fragment newFragment = newFrag.create(position);
            return newFragment;
        }
        @Override
        public int getCount() {
            return NUM_PAGES;
        }
    }
    public void set_fragment_data(String biz_data[]){
        // title as business name
        setTitle(biz_data[1]);
    }
}

ScreenSlidePageFragment

package com.example.dgzl.corvegas;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
/**
 * A fragment representing a single step in a wizard. The fragment shows a dummy title indicating
 * the page number, along with some dummy text.
 *
 * <p>This class is used by the {@link } and {@link
 * ScreenSlideActivity} samples.</p>
 */
public class ScreenSlidePageFragment extends android.support.v4.app.Fragment {
    /**
     * The argument key for the page number this fragment represents.
     */
    public static final String ARG_PAGE = "page";
    /**
     * The fragment's page number, which is set to the argument value for {@link #ARG_PAGE}.
     */
    private int mPageNumber;
    public String[] todays_data, biz_data, special_data;
    public String all_data = "hardcoded and not good";
    /**
     * Factory method for this fragment class. Constructs a new fragment for the given page number.
     */
    public static ScreenSlidePageFragment create(int pageNumber) {
        ScreenSlidePageFragment fragment = new ScreenSlidePageFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_PAGE, pageNumber);
        fragment.setArguments(args);
        Log.d("OnCreateView: ", "2");
        return fragment;
    }
    public ScreenSlidePageFragment() {
    }
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPageNumber = getArguments().getInt(ARG_PAGE);
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        ViewGroup rootView;
        Log.d("OnCreateView: ", "1");
        TextView tv;
        switch(getPageNumber()){
            case 0:
                rootView = (ViewGroup) inflater.inflate(R.layout.fragment_today, container, false);
                tv = (TextView)rootView.findViewById(R.id.today_frag_tv);
                tv.setText(R.string.today_frag);
                break;
            case 1:
                rootView = (ViewGroup) inflater.inflate(R.layout.fragment_business, container, false);
                tv = (TextView)rootView.findViewById(R.id.biz_frag_tv);
                tv.setText(all_data);
                break;
            case 2:
                rootView = (ViewGroup) inflater.inflate(R.layout.fragment_specials, container, false);
                tv = (TextView)rootView.findViewById(R.id.specials_frag_tv);
                tv.setText(R.string.special_frag);
                break;
            default:
                rootView = (ViewGroup) inflater.inflate(R.layout.fragment_today, container, false);
                tv = (TextView)rootView.findViewById(R.id.today_frag_tv);
                tv.setText(R.string.today_frag);
        }
        // Set the title view to show the page number.
//        ((TextView) rootView.findViewById(android.R.id.text1)).setText(getString(R.string.title_template_step, mPageNumber + 1));
        return rootView;
    }

    /**
     * Returns the page number represented by this fragment object.
     */
    public int getPageNumber() {
        return mPageNumber;
    }
    public void set_data(String[] todays_data, String[] biz_data, String[] special_data) {
        this.todays_data = todays_data;
        this.biz_data = biz_data;
        this.special_data = special_data;
    }
    public void set_all_data(String all_data) {
        this.all_data = all_data;
    }
    public void get_data() {
    }
}

问题在getItem()方法。你正在创建一个new ScreenSlidePageFragment,之后,你调用create()方法,再次创建一个new ScreenSlidePageFragment。您需要以静态方式调用ScreenSlidePageFragment.create(position)

@Override
public Fragment getItem(int position) {
     String test_data = "Soem data";
     ScreenSlidePageFragment newFrag = ScreenSlidePageFragment.create(position);
     newFrag.set_all_data(test_data);
     return newFragment;
}

最新更新