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傳遞資料,整個項目的代碼:
代碼