我看别人封装的代码,都是习惯于使用Fragment类进行操作,一个Activity类管理多个Fragment中,并且管理碎片的重用性(自定义方法,在onSaveInstance和onCreate中进行保存和回复),所以往往一个Activity类写的非常复杂,看的头晕脑胀的。今天看的是Facebook登录封装的demo,也是这么使用的,回调学的不好真悲剧啊,而且还自定义回调。Fragment可以当成一个控件进行使用,即集合了Activity的功能又集合了View的功能。因为一般如果要自定义监听、回调都是相对于一个View而言的,比如一个按钮,我想自定义一个点击事件叫做onButtonXXXlistener,名字可以随便起,这时就需要创建一个Button的子类继承Button,在里面添加监听、回调的操作。同理Fragment也有View的这个特点,可以自定义监听回调方法,下面是一个demo的解析:
1.activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<FrameLayout android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/fragment_container"></FrameLayout>
</RelativeLayout>
2.MainActivity.java
package com.example.demo;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.view.View;
import android.widget.Toast;
import com.example.demo.MyFragment.onButtonClickListenre;
public class MainActivity extends FragmentActivity {
private FragmentManager manager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
manager = getSupportFragmentManager();
MyFragment fragment = new MyFragment();
manager.beginTransaction().add(R.id.fragment_container, fragment).commit();
fragment.setOnButtonClickListener(new onButtonClickListenre() {
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.button:
Toast.makeText(getApplicationContext(), "dian ji le anniu", 0).show();
break;
default:
break;
}
}
});
}
}
3.fragment_my.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="button" />
</RelativeLayout>
4.MyFragment.java
package com.example.demo;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
public class MyFragment extends Fragment {
private onButtonClickListenre listener;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_my, null);
view.findViewById(R.id.button).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if (listener != null) {
listener.onClick(view);
}
}
});
return view;
}
public interface onButtonClickListenre {
void onClick(View view);
}
public void setOnButtonClickListener(onButtonClickListenre listener) {
this.listener = listener;
}
}
很多封装的代码都爱使用这种模式,在碎片中自定义各种监听回调,必须好好研究一下,虽然看起来简单,但是不理顺一下,有时还是很晕。