BaseFragment的TitleBar封裝如下
~~~
public class BaseFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.d("fragment:onCreateView", getView());
return null;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Log.d("fragment:onCreateView", getView());
findViewById();
}
private ViewSwitcher[] titleSwitcher;
/**
* 初始化View
*/
protected void findViewById() {
titleSwitcher = new ViewSwitcher[3];
titleSwitcher[0] = (ViewSwitcher) findViewById(R.id.app_title_left_switcher);
titleSwitcher[1] = (ViewSwitcher) findViewById(R.id.app_title_middle_switcher);
titleSwitcher[2] = (ViewSwitcher) findViewById(R.id.app_title_right_switcher);
}
protected void setTitle(TitleRes leftTitle, TitleRes middleTitle, TitleRes rightTitle) {
TitleRes[] reses = new TitleRes[] { leftTitle, middleTitle, rightTitle };
for (int i = 0; i < reses.length; i++) {
TitleRes res = reses[i];
ViewSwitcher switcher = titleSwitcher[i];
if (res == null) {
switcher.setVisibility(View.INVISIBLE);
} else {
switcher.setVisibility(View.VISIBLE);
// 觸發單擊事件的View
View clickView = null;
// 文字
if (res.getType() == 0) {
switcher.setDisplayedChild(0);// 顯示TextView
//
Object resource = res.getResource();
String title = resource instanceof Integer ? getResources().getString((Integer) resource) : String.valueOf(resource);
((TextView) switcher.getChildAt(0)).setText(title);
clickView = switcher.getChildAt(0);
} else {
switcher.setDisplayedChild(1);// 顯示ImageView
//
int imageResource = (Integer) res.getResource();
((ImageView) switcher.getChildAt(1)).setImageResource(imageResource);
clickView = switcher.getChildAt(1);
}
// 設置title的單擊事件
clickView.setOnClickListener(res.getClickListener());
}
}
}
protected View findViewById(int id) {
return getView().findViewById(id);
}
}
~~~
子類調用
~~~
public class HomeFragment extends BaseFragment implements View.OnClickListener {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View layout = inflater.inflate(R.layout.home, container, false);
super.onCreateView(inflater, container, savedInstanceState);
return layout;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
findViewById(R.id.home_title_sample).setOnClickListener(this);
TitleRes left = null;
TitleRes middle = new TitleRes("首頁標題");
TitleRes right = null;
setTitle(left, middle, right);
}
~~~
可以發現跟BaseActivity 中的代碼實現基本上是類似的
但是BaseActivity和BaseFragment又沒有共同的父類
?這個時候需要采用 組合的方式進行代碼重構
~~~
/**
* 因為Fragment和Activity沒有共同的父類 ,但是他們各自的父類里又有一些TitleBar相同的業務邏輯處理<br>
* 所以我創建了該類
*
* @author coffee <br>
* 2015-12-24 下午10:26:10
*/
public class TitleMgr {
/**
* TitleBar的上下文
*/
private Context context;
/**
* TitleBar所在的頂層View容易
*/
private View contentView;
/**
* 三個Title
*/
private ViewSwitcher[] titleSwitcher;
public TitleMgr(Context context, View contenView) {
this.context = context;
this.contentView = contenView;
}
private Resources getResources() {
return context.getResources();
}
private View findViewById(int id) {
return contentView.findViewById(id);
}
/**
* 初始化title bar
*/
public void findViewById() {
titleSwitcher = new ViewSwitcher[3];
titleSwitcher[0] = (ViewSwitcher) findViewById(R.id.app_title_left_switcher);
titleSwitcher[1] = (ViewSwitcher) findViewById(R.id.app_title_middle_switcher);
titleSwitcher[2] = (ViewSwitcher) findViewById(R.id.app_title_right_switcher);
}
public void setTitle(TitleRes leftTitle, TitleRes middleTitle, TitleRes rightTitle) {
TitleRes[] reses = new TitleRes[] { leftTitle, middleTitle, rightTitle };
for (int i = 0; i < reses.length; i++) {
TitleRes res = reses[i];
ViewSwitcher switcher = titleSwitcher[i];
if (res == null) {
switcher.setVisibility(View.INVISIBLE);
} else {
switcher.setVisibility(View.VISIBLE);
// 觸發單擊事件的View
View clickView = null;
// 文字
if (res.getType() == 0) {
switcher.setDisplayedChild(0);// 顯示TextView
//
Object resource = res.getResource();
String title = resource instanceof Integer ? getResources().getString((Integer) resource) : String.valueOf(resource);
((TextView) switcher.getChildAt(0)).setText(title);
clickView = switcher.getChildAt(0);
} else {
switcher.setDisplayedChild(1);// 顯示ImageView
//
int imageResource = (Integer) res.getResource();
((ImageView) switcher.getChildAt(1)).setImageResource(imageResource);
clickView = switcher.getChildAt(1);
}
// 設置title的單擊事件
clickView.setOnClickListener(res.getClickListener());
}
}
}
}
~~~
~~~
public class BaseFragment extends Fragment {
private TitleMgr titleMgr;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.d("fragment:onCreateView", getView());
return null;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Log.d("fragment:onCreateView", getView());
//
titleMgr = new TitleMgr(getActivity(), getView());
titleMgr.findViewById();
}
protected void setTitle(TitleRes leftTitle, TitleRes middleTitle, TitleRes rightTitle) {
titleMgr.setTitle(leftTitle, middleTitle, rightTitle);
}
~~~
~~~
public abstract class BaseActivity extends Activity {
private TitleMgr titleMgr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMgr.push(this);
findViewById();
}
/**
* 初始化View
*/
protected void findViewById() {
titleMgr = new TitleMgr(getContext(), findViewById(android.R.id.content));
titleMgr.findViewById();
}
protected void setTitle(TitleRes leftTitle, TitleRes middleTitle, TitleRes rightTitle) {
titleMgr.setTitle(leftTitle, middleTitle, rightTitle);
}
~~~
我把業務邏輯抽出來放在單獨寫好的TitleMgr類中,然后BaseActivity和BaseFragment采用組合?也算是代理模式實現吧
- 前言
- Android sdk開發 - 序
- Android sdk開發(一)Application設計
- Android sdk開發(二) Log日志類的設計
- Android SDK開發 (三) App的屬性配置
- android SDK開發-- 功能設計
- android SDK開發 -- TitleBar封裝(一)
- android SDK開發 -- TitleBar封裝(二)
- Android SDK開發 -- TitleBar重構 (代理模式的使用)
- Android SDK開發 -- TitleBar重構 (代理模式-優化)
- android SDK核心功能 -- 消息傳遞與界面刷新
- Android SDK開發 -- TitleBar重構 - 使用策略模式、舍棄代理模式