说明第一下:按照前面的方式我们创建了项目,如果使用的是最新的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中。
至于原因?欢迎大家发表评论来讨论这个问题。。。