android笔记4——Fragment的使用

说明第一下:按照前面的方式我们创建了项目,如果使用的是最新的ADT,Minimum Android SDK选的是android2.*或1.*,此时会默认创建一个兼容的项目,——appcompat_v7,这个项目还是不能删除的,删除会报错。。

说明第二下:项目创建好了之后,发现layout文件夹(布局)中会有默认两个文件:adtivity和fragment文件:


1、Fragment概述:

Fragment意思为碎片,片段,说白了就是模块,说道模块,就不用我多说了。。

特征:

Fragment总是“嵌入”activity中使用的,作为activity中的界面组成部分;

一个activity可以包含多个Fragment,一个Fragment也可以被多个activity复用;

Fragment可以响应自己的事件,也拥有自己的生命周期。

首先我们先看一下我们要达到什么要求:

  

 
2、fragment_main.xml文件:

内容如下:

<LinearLayout 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:orientation="vertical"
    tools:context="com.javen.xresource.activity.fragment.MainFragment" >

    <TextView
        android:id="@+id/ftxv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/fragment" />
    <Button 
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/change_fragment"/>
    <Button 
        android:id="@+id/btn2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/change_activity"/>

</LinearLayout>
在fragment中定义了两个按钮和一个文本显示,以及在activity中也定义了一个文本显示,点击fragment不同按钮控制文本显示。

activity_main.xml内容如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.javen.xresource.activity.MainActivity"
    tools:ignore="MergeRootFrame">
	
    <TextView 
        android:id="@+id/atxv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/activity"/>
    
    <!-- xml方式在activity中嵌入fragment -->
    <fragment 
        android:name="com.javen.xresource.activity.fragment.MainFragment"
        android:id="@+id/mft"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    
</LinearLayout>

3、创建MainFragment.java类:

package com.javen.xresource.activity.fragment;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

import com.javen.xresource.activity.R;

public class MainFragment extends Fragment {
	private TextView fragmentTextView;
	private Button button;

	public MainFragment() {
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View rootView = inflater.inflate(R.layout.fragment_main, container,
				false);	//使用fragment_main.xml初始化Fragment
		
		button = (Button) rootView.findViewById(R.id.btn);	//获取Fragment中的Button
		fragmentTextView = (TextView) rootView.findViewById(R.id.ftxv);	//获取Fragment中的TextView
		
		button.setOnClickListener(new OnClickListener() {	//设置按钮的监听事件
			@Override
			public void onClick(View v) {
				fragmentTextView.setText("我被fragment点击了...");
			}
		});
		
		return rootView;
	}
}

此时Fragment已经搞定了。。。

4、MainActivity.java

代码如下:

package com.javen.xresource.activity;

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

	private Button button;
	private TextView activityTextView;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		/*if (savedInstanceState == null) {
			getFragmentManager().beginTransaction()
					.add(R.id.container, new MainFragment()).commit();	//java代码方式在activity中嵌入Fragment,与前面xml方式一样
		}*/	
		
		activityTextView = (TextView) findViewById(R.id.atxv);	//获取activity中的TextView
		
		Fragment fragment = getFragmentManager().findFragmentById(R.id.mft);	//获取activity中的fragment
		button = (Button) fragment.getView().findViewById(R.id.btn2);	//获取fragment中的Button2
		button.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				activityTextView.setText("我被activity点击了...");
			}
		});
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {

		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
}

将项目运行即可。。。

6、问题来了:Button2 改变activity中TextView的操作能不能放在Fragment?--> 延伸出:Fragment能不能与Activity通信?

衍生问题后面再说,通信肯定是可以的。

至于对TextView的操作都放在Fragment中。。。本人尝试过,使用:

getActivity().findViewById(R.id.atxv);

是不能获取到Activity中的View元素的,此语句返回的是null。所以Button2的操作还是得放在activity中。

至于原因?欢迎大家发表评论来讨论这个问题。。。





android笔记4——Fragment的使用,,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。