说明第一下:按照前面的方式我们创建了项目,如果使用的是最新的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的使用