`

关于在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;
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-generated method stub
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
	}

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

	public void setCommandlistener(CommandListener commandlistener) {
		this.commandlistener = commandlistener;
	}
	
	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{

	@Override
	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" >

    <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"
        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" />
    </LinearLayout>
</RelativeLayout>

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

效果图如下:

 

五、定义自己的BaseMainActivity

 

import android.content.Context;
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;
import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
import android.widget.ImageView;
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;
	@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); // 按下其他按钮,调用父类进行默认处理
	}

	@Override
	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();

	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) {
		// // 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);
		}
	}

	// 设置中间的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();
	}

	@Override
	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;
				}
		}
	};
}

六、定义基本的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
                      
		}

}

 

 这个时候,头部栏都不用以后开发者的配置了,如果有返回,那么当继承这个后就已经配置好了。

 

  • 大小: 7.1 KB
分享到:
评论

相关推荐

    ANDROID STUDIO 个人学习笔记

    - 关于`android:supportsRtl="true"`属性的使用,这表示应用程序支持从右到左(RTL)布局,有助于应用在多语言环境中正确显示。 4. DialogFragment与宿主Fragment通信 - 探讨如何在Android开发中实现Fragment之间...

    Fragment解析

    在Android开发中,`Fragment`是一种重要的UI设计模式,它使得应用程序能够在不同的屏幕尺寸和配置下提供一致且灵活的用户界面。`Fragment`可以理解为一种可重用的UI组件,它可以被嵌入到`Activity`中,并在其中执行...

    利用RecyclerView在Fragment中实现瀑布流

    目录前言项目源码准备工作Layout文件的构建JAVA程序的编写新建Peaky类Adapter适配器修改WechatFragment项目心得 前言 上周通过Android开发中的fragment实现了简易微信界面 的搭建,本周将在其基础上在fragment中进行...

    android培训学习心得体会.doc

    在实践中,我发现Android的生命周期管理是开发者需要特别关注的点,理解Activity和Fragment的生命周期对于确保应用程序的稳定性和性能至关重要。同时,Intent作为Android中的一种消息传递机制,用于启动活动、服务等...

    大学生安卓期末课程设计、一看仿菜谱的App 包含源代码、使用手册和心得体会

    本项目名为“安卓期末课程设计菜谱app”,旨在帮助大学生熟悉Android应用程序的开发流程,提供完整的源代码、使用手册以及开发过程的心得体会,为学生的课程设计提供实用资源。 首先,让我们深入探讨菜谱App的核心...

    Android项目源码考研助手源码

    源码中可能会涉及到Activity管理、Intent传递、Fragment使用、布局设计以及各种安卓API的调用。 2. **数据存储**:应用中可能使用SQLite数据库来存储考研资料和用户信息。了解如何操作SQLite数据库,创建表、插入、...

    基于Android Studio开发的旅游记录与分享APP源码,Android旅游路线记录与分享APP源码

    在本项目中,我们主要探讨的是一个基于Android Studio开发的旅游记录与分享应用程序。这个APP的设计目的是为了帮助用户轻松地规划他们的旅行路线,记录旅行经历,并与其他旅行爱好者分享这些珍贵的时刻。以下将详细...

    android开发介绍及心得.docx

    本文将深入探讨Android开发中的核心概念,并分享一些实用的心得体会。 #### Android开发的核心概念 ##### 1. **Activity和Fragment** - **Activity**: Android应用的基础组成部分,负责展示用户界面和处理用户...

    安卓期末课程设计、一款刷小视频的App 包含源代码、使用手册和心得体会

    13. **使用手册和心得体会**:这部分内容提供了开发者在开发过程中的经验和技巧,包括遇到的问题、解决方案、优化策略等,对于学习者极具价值。 总的来说,这款安卓小视频App项目不仅覆盖了Android应用开发的基本...

    fragment+viewpager的经典组合

    最近由于项目的原因,需要实现翻页效果,苦于安卓开源的不成熟,3D书卷翻页等开源,不合适直接嵌来完成显示,flip使用又一直OOM,后期想了下,现在都开始扁平化时代了,所以,我何不直接采用左右滑动切换呢,那不是...

    Android知识系统总结

    在Android知识系统总结中,我们可以探索一系列关于Android应用开发的重要概念和实践经验。这个压缩包包含的资源非常丰富,包括7个完整的Android应用程序源代码、学习笔记、开发入门指南以及一些入门书籍,为初学者和...

    android天气预报app(十分经典).rar.rar.rar

    通过这个经典的Android天气预报APP项目,开发者不仅可以学习到Android应用开发的基本流程,还能了解到实际项目中的最佳实践和常见问题解决方案,对于提升个人技能和理解实际开发流程具有重要作用。

    Android编程开发指南

    书中不仅讲解了基础概念,还介绍了高级功能,如使用Fragment进行模块化开发等,这些都要求读者具备一定的编程基础和理解能力。 在开发环境方面,本书的读者应该了解如何使用Android Studio或其他IDE进行开发,同时...

    android开发介及心得.docx

    ### Android开发介绍与心得 #### 一、Android操作系统概述 Android是一个开源的移动操作系统,其核心基于Linux内核。该操作系统最初由Andy Rubin等人于2003年创建,并于2005年被Google收购。自那时起,Android迅速...

    Android代码-[安卓开源]随手记安卓记账项目.zip

    本开源项目“随手记安卓记账项目”是一个基于 Android 平台的个人财务管理应用,旨在帮助用户轻松记录日常生活中的收支情况,实现财务透明和规划。通过开源的方式,开发者可以深入理解 Android 应用开发的各种技术和...

    Android系统总结+精通android

    同时,Android还支持Fragment,允许在不同屏幕尺寸的设备上灵活展示内容。 UI设计遵循Material Design指南,这是一种统一的设计语言,强调了色彩、形状、动画和交互的一致性。通过使用ConstraintLayout、...

    天气预报app android studio

    - **技术选型**:由于Android Studio不允许在主线程中访问网络,因此需使用异步任务(AsyncTask)或新线程来处理网络请求。 - **实现步骤**: - 创建新线程执行HTTP请求。 - 解析返回的JSON数据,常用方法是使用`...

    安卓期末课程设计、一看仿微信的App 包含源代码、使用手册和心得体会

    在本课程设计中,我们将探讨如何使用Android平台开发一款仿微信的应用程序,这是一次针对K12阶段移动软件开发的期末课程设计实践。通过这个项目,学生将深入理解Android应用的基本架构,学习如何实现类似微信的核心...

    Java最全面试题宝典.rar

    Android(安卓) Android基础知识 Android内存泄漏总结 Handler内存泄漏分析及解决 Handler、Looper、Message、MessageQueue基础流程分析 ...Android ORM 框架之 greenDAO 使用心得 Data Binding(数据绑定)用户指南

    最全java面试题.zip

    ##第一部分: Android基础知识 Android内存泄漏总结 Handler内存泄漏分析及解决 Handler、Looper、Message、MessageQueue基础流程分析 Android性能优化 ...Android ORM 框架之 greenDAO 使用心得 Data Binding(数

Global site tag (gtag.js) - Google Analytics