天天看點

fragment和activity之間進行資料互動

fragmnt 在現在的應用中使用的很多,fragment 和activity之間需要進行資料的互動。本文将從以下二個小的例子,第一個fragment在建立的時候擷取從activity傳過來的參數,第二個activity擷取fragment 中的參數。

首先看第一個 activity中建立 fragment的時候,需要傳遞資料給fragment,我們可以這樣做:

在activity 中:

dutyDepartmentFragment = new DutyDepartmentFragment();
        Bundle Rbundle = new Bundle();
        Rbundle.putString("petitionFileId",petitionFileId);
        Rbundle.putString("pRState",pRState);
        Rbundle.putString("pRDegree",pRDegree);
        Rbundle.putString("pRNote",pRNote);
        dutyDepartmentFragment.setArguments(Rbundle);
           

在對應的fragment中,我們要擷取這些參數很簡單:

petitionFileId = getArguments().getString("petitionFileId");
        pRState = getArguments().getString("pRState");
        pRDegree = getArguments().getString("pRDegree");
        pRNote = getArguments().getString("pRNote");
           

如果我們想在activity中擷取fragment中的參數,可以使用接口回調的思想來實作。下面是我的一個小的demo,這個例子是這樣的,在一個activity中有二個fragment,我們希望在activity中點選一個按鈕之後就能擷取在fragment 中的指定參數。

activity的代碼

public class MainActivity extends AppCompatActivity implements FragmentOne.sendReslut {


    private Button button_submit;// 送出按鈕
    private TextView tv_petition_deparement;// 對信訪部門評價
    private TextView tv_duty_deparment;// 對責任部門評價
    private View View_Line;// 選擇線
    private ViewPager viewPager;// viewpager
    private FragmentOne fragmentOne;
    private FragmentTwo fragmentTwo;
    private ArrayList<Fragment> fragments;
    private FragmentAdapter fragmentAdapter;
    private int currIndex = ;
    private int tabLineLength;

    private Resources resource;
    private ColorStateList csl;
    private ColorStateList csl_hint;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        // 初始化化控件
        button_submit = (Button) findViewById(R.id.button_submit);
        tv_petition_deparement = (TextView) findViewById(R.id.tv_petition_deparement);
        tv_duty_deparment = (TextView) findViewById(R.id.tv_duty_deparment);
        View_Line = (View) findViewById(R.id.View_Line);
        viewPager = (ViewPager) findViewById(R.id.viewPager);
        fragmentOne = new FragmentOne();
        fragmentTwo = new FragmentTwo();
        fragments = new ArrayList<Fragment>();
        fragments.add(fragmentOne);
        fragments.add(fragmentTwo);

        fragmentAdapter = new FragmentAdapter(this.getSupportFragmentManager(), fragments);
        viewPager.setAdapter(fragmentAdapter);
        viewPager.setCurrentItem(currIndex);

        Display display = getWindow().getWindowManager().getDefaultDisplay();
        // 得到顯示屏寬度
        DisplayMetrics metrics = new DisplayMetrics();
        display.getMetrics(metrics);
        // 1/3螢幕寬度
        tabLineLength = metrics.widthPixels / ;
        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) View_Line.getLayoutParams();
        lp.width = tabLineLength;
        View_Line.setLayoutParams(lp);

        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

                LinearLayout.LayoutParams ll = (android.widget.LinearLayout.LayoutParams) View_Line
                        .getLayoutParams();

                if (currIndex == position) {
                    ll.leftMargin = (int) (currIndex * tabLineLength + positionOffset
                            * tabLineLength);
                } else if (currIndex > position) {
                    ll.leftMargin = (int) (currIndex * tabLineLength - ( - positionOffset) * tabLineLength);
                }
                View_Line.setLayoutParams(ll);

            }

            @Override
            public void onPageSelected(int position) {
                currIndex = position;

                if (position == ) {
                    tv_petition_deparement.setTextColor(csl);
                    tv_duty_deparment.setTextColor(csl_hint);

                } else {
                    tv_petition_deparement.setTextColor(csl_hint);
                    tv_duty_deparment.setTextColor(csl);
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

        resource = (Resources) getBaseContext().getResources();
        csl = (ColorStateList) resource.getColorStateList(R.color.textColor);
        csl_hint = (ColorStateList) resource.getColorStateList(R.color.hintTextColor);

        tv_petition_deparement.setTextColor(csl);
        tv_duty_deparment.setTextColor(csl_hint);

        tv_petition_deparement.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //
                tv_petition_deparement.setTextColor(csl);
                tv_duty_deparment.setTextColor(csl_hint);
                viewPager.setCurrentItem();
                currIndex = ;

            }
        });
        tv_duty_deparment.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                tv_petition_deparement.setTextColor(csl_hint);
                tv_duty_deparment.setTextColor(csl);
                viewPager.setCurrentItem();
                currIndex = ;
            }
        });

        // 點選送出按鈕之後,調用 fragmentOne 的方法,進而回調接口
        button_submit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // activity 中 調用fragment中的方法,傳回 fragment 中的參數
                fragmentOne.postData();
            }
        });


    }

    // 通過回調接口把fragment的資料傳遞給activity
    @Override
    public void send(String data) {
        Toast.makeText(getApplicationContext(), data, Toast.LENGTH_SHORT).show();
    }
}
           

有回調接口的fragment

public class FragmentOne extends Fragment {

    private sendReslut sendresult;
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        sendresult = (sendReslut) getActivity();
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

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

        View view = inflater.inflate(R.layout.fragment_one,null);
        return view;
    }

    public void postData(){
        sendresult.send("這是測試資料");
    }


     public interface sendReslut{
         public void send(String data);
     }

}
           

上面的代碼也比較簡單,通過一個簡單的接口,我們就實作了fragment給activity傳遞資料,整個項目的代碼:

代碼