关于在android项目中使用fragment的个人经验

时间:2022-12-22 05:37:31
关于在android项目中使用fragment的个人心得

在android应用的开发过程中,我使用过fragment来进行快速开发,我们知道java web中的iframe。这个时候,fragment就有这个用途了。

这个fragment是android.support.v4.app.Fragmet

?

一、定义基础的BaseFragmentActivity

?

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.support.v4.app.FragmentActivity;
import android.util.Log;www.0871hx.com
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Toast;

public abstract class BaseFragmentActivity extends FragmentActivity implements OnClickListener{

protected boolean savedState = false;

protected CommandListener commandlistener; //很重要,把activity中的命令,传递给fragment

/********************************************/

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generatwww.lzfsk.comed method stub
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
}

/***********************************************/
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
www.kmxxfk.com
if(commandlistener!=null){
commandlistener.execute(v);
}

}

public void setCommandlistener(CommandListener commandlistener) {
this.commandlistener = commandlistener;
}
www.64186418.com
public interface CommandListener
{
public void execute(View v);
}

}

?

二、定义你baselayout布局文件

?

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">


</LinearLayout>

三、定义BaseFragment

?

import android.os.Bundle;

import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;


public class BaseFragment extends Fragment{

@Overridewww.szbnmz.com
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.baselayout, container, false);
}


}

?

四、定义应用的主界面fragment_main

?

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/control_popuplay"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#eee"
android:orientation="vertical" >www.bnzrpf.com

<include
android:id="@+id/fragment_main_top"
android:layout_width="match_parent"
android:layout_height="@dimen/title_height"
android:layout_alignParentTop="true"
layout="@layout/title_view" />

<include
android:id="@+id/bottom"
android:layout_width="match_parent"
android:layout_height="55dp"www.kmhxyyfk.com
android:layout_alignParentBottom="true"
layout="@layout/bottom_view" />

<LinearLayout
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_above="@id/bottom"
android:layout_below="@+id/fragment_main_top"
android:orientation="vertical" >

<fragment
android:id="@+id/mainfragment"
android:name="com.company.waiqing.activity.fragments.BaseFragment"
android:layout_width="fill_parent"
android:layout_height="match_parent" />www.kmhxnkyy.com
</LinearLayout>
</RelativeLayout>

?从上面的代码可以看出,这个时候的主界面

效果图如下:
关于在android项目中使用fragment的个人经验
?

五、定义自己的BaseMainActivity

?

import android.content.Context;www.kmhxnk.com
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.util.DisplayMetrics;

import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;www.kmhx120.com
import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
import android.widget.ImageView;www.gywcjb120.com
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

public abstract class BaseMainActivity extends BaseFragmentActivity{

protected ImageView left_button; //头部栏的左边的按钮
protected TextView title; //头部栏的标题
protected ImageView rightbutton; //头部栏的右边按钮
protected RelativeLayout bottom; //底部栏的布局


private Popup_holder holder; //弹出框
protected PopupWindow window;www.myfengxiang.com
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP
&& event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
BaseMainActivity.this.finish();
return true;
}
if (event.getAction() == KeyEvent.ACTION_DOWN
&& event.getKeyCode() == KeyEvent.KEYCODE_MENU) {
return true;
}
return super.dispatchKeyEvent(event); // 按下其他按钮,调用父类进行默认处理
}

@Overridewww.junkenk.net
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
//打开Activity隐藏软键盘;
getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

setContentView(R.layout.fragment_main);
Logger.i("test", "initUI");
initUI();
initTitle();
run();
initFragment(); // 初始化fragment
}

private void initUI() {
bottom=(RelativeLayout) findViewById(R.id.bottom);
}

public abstract void run();www.gywczx.com

protected void initTitle() {
left_button = (ImageView) findViewById(R.id.iv_left_button);
title = (TextView) findViewById(R.id.title_text);
rightbutton = (ImageView) findViewById(R.id.iv_right_button);
left_button.setOnClickListener(topviewlisterner);
rightbutton.setOnClickListener(topviewlisterner);
// back.setImageResource(R.drawable.back_icon);
// back.setOnClickListener(new OnClickListener() {
//
// @Override
// public void onClick(View v) {www.bnzr120.com
// // TODO Auto-generated method stub
// finish();
// }
// });
}




private void initFragment() {
Logger.i("test", "initFragment");
CommonFragment f = (CommonFragment) setFragment();
Logger.i("test", "status:" + savedState);

if (f != null) {
f.setRefreshListener(this);
fragmentchage(f);www.junkefk.com
}
}

// 设置中间的fragment
protected Fragment setFragment() {
return null;
}

// 设置当前的fragment界面
private void fragmentchage(Fragment newFragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
fragmentTransaction.replace(R.id.mainfragment, newFragment);
fragmentTransaction.commit();
}

@Overridewww.bnzrpf.com
protected void onPause() {
// TODO Auto-generated method stub
//FragmentManager fragmentManager = getSupportFragmentManager();
//Logger.i("test", fragmentManager.getBackStackEntryCount() + "");
//fragmentManager.popBackStack();
super.onPause();
}

//顶部按钮监听器,在这里就可以对顶部按钮进行处理
OnClickListener topviewlisterner=new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
// 进行弹出窗口
case R.id.iv_left_button:
initControlPopupView(v);
break;
case R.id.iv_right_button:
BaseMainActivity.this.finish();
break;
}www.szbnmz.com
}
};
}

六、定义基本的CommonFragment

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
*
* @author arrau
* 必须实现commandlistener,这个是用来接收主界面传过来的命令
*/

public abstract class CommonFragment extends Fragment implements CommandListener{

protected BaseFragmentActivity context;
protected DestoryListener destorylistener;
protected View view;

@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
Logger.i(log, "onAttach");
context = (BaseFragmentActivity) activity;
}

public void setFragmentContentView(int layout) {
view = LayoutInflater.from(context).inflate(layout, null);
context.setCommandlistener(this);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
Logger.i(log, "onCreateView");
return view;
}

public FragmentManager getSupportFragmentManager() {
return context.getSupportFragmentManager();
}

public View findViewById(int id) {
return view.findViewById(id);
}

public FragmentActivity getContext() {

return context;
}


@Override
public void onDestroy() {
// TODO Auto-generated method stub
if(destorylistener!=null)
{
destorylistener.FragmentDestory(); //当fragment退出时,就让activity退出
}

super.onDestroy();
}



@Override
public void onPause() {
// TODO Auto-generated method stub
Logger.i(log, "onPause");
super.onPause();
}

@Override
public void onResume() {
// TODO Auto-generated method stub
Logger.i(log, "onResume");
super.onResume();
}

@Override
public void onStart() {
// TODO Auto-generated method stub
Logger.i(log, "onStart");
super.onStart();
}

@Override
public void onStop() {
// TODO Auto-generated method stub
Logger.i(log, "onStop");
super.onStop();
}

@Override
public void onDestroyView() {
// TODO Auto-generated method stub
Logger.i(log, "move to other view");
super.onDestroyView();
}


@Override
public void execute(View v) {
// TODO Auto-generated method stub

}

//fragment销毁通知
public interface DestoryListener
{
public void FragmentDestory();
}

public DestoryListener getDestorylistener() {
return destorylistener;
}

public void setDestorylistener(DestoryListener destorylistener) {
this.destorylistener = destorylistener;
}
}

?

?

七、怎么利用

?

??????? 有的人可能会问,上面这么多代码,我还不如直接一个一个activity写。我的观点是,虽然上面的代码多,但是如果有很多的界面的话,那么就能节约大量的时间,以便以后开发的便利。

???????

??????? 以后每个activity都要继承BaseMainActivity

?

ClientPoolActivity extends BaseMainActivity{

@Override
public void run() {
// TODO Auto-generated method stub
title.setText("客户池");
}

@Override
protected Fragment setFragment() {
// TODO Auto-generated method stub
ClientPoolFragment cf=new ClientPoolFragment();
return cf;
}

}

?

每个fragment都要继承ClientNewCreateFragment

?

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.company.core.utils.IntentUtil;

public class ClientNewCreateFragment extends CommonFragment{
private Client_Holder holder;
private ClickListener clistener;
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
holder=new Client_Holder();
clistener=new ClickListener();
setFragmentContentView(R.layout.fragment_client_newcreate);//中间部分的layout布局
holder.t_company=(LinearLayout)findViewById(R.id.fragment_client_newcreate_companylin);
holder.t_person=(LinearLayout)findViewById(R.id.fragment_client_newcreate_personlin);
holder.t_company.setOnClickListener(clistener);
holder.t_person.setOnClickListener(clistener);

}

private class Client_Holder{
LinearLayout t_company,t_person;
}


private class ClickListener implements OnClickListener{

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}

}

//这个是得到主界面已经监听过后的view,是BaseMainActivity把按钮事件传过来
@Override
public void execute(View v) {
// TODO Auto-generated method stub

}

}