从Fragment中传数据到Activity
背景
这是在项目中遇到的问题。在一个Activity中,有viewpager,viewpager里面放置的当然那是fragment了,然后fragment中有button什么的,在点击button的时候,希望能够改变Activity中的一些数据。
比如最常见的通过viewpager选择标签等。
之前想到的解决办法是直接将Activity中的控件等需要接受响应之后改变数据的类型都设为static,这是个很愚蠢的方法,容易造成内存泄露。
解决方法
通过在fragment中实现接口来解决。
1.在fragment用onAttach方法连接到上下文
private Activity activity;
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof Activity){
activity = (Activity)context;
}
}
2.对fragment中发出响应的控件加上接口
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.my_fragment, container, false);
Button button = (Button) view.findViewById(R.id.button);
button.setText(getArguments().getString("MESSAGE"));
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
((OnButtonClickListener)activity)
.OnButtonClick(getArguments().getInt("POSITION"));
} catch (ClassCastException cce){
cce.printStackTrace();
}
}
});
return view;
}
public interface OnButtonClickListener {
void OnButtonClick(int position);
}
3.在Activity中对接口进行处理:
public class MainActivity extends AppCompatActivity
implements MyFragment.OnButtonClickListener {
private TextView text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = (TextView)findViewById(R.id.text_view);
ViewPager pager = (ViewPager) findViewById(R.id.viewPager);
pager.setAdapter(new MyFragmentAdapter(getSupportFragmentManager()));
}
@Override
public void OnButtonClick(int position) {
text.setText("Click button " + position);
}
}