问题描述:
在MainActivity的布局文件中有两个Fragment,其中左边的Fragment的布局是一个ListView,右边的Fragment是一个TextView
我们想要实现的需求是:通过点击左边ListView中的条目,在右边显示与之对应的内容。
这里我们需要用到回调函数。
这里我们先定义一个接口:
package org.mobiletrain.fragment_demo09;
/**
* 定义一个接口用来获取内容
* @author Administrator
*
*/
public interface OnGetContentListener {
public void getContent(String content);
}
MainActivity:
package org.mobiletrain.fragment_demo09;
import android.os.Bundle;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
/**
* 这里MainActivity需要实现接口OnGetContentListener并重写其
* getContent()方法
* @author Administrator
*
*/
public class MainActivity extends Activity implements OnGetContentListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**
* 这里默认已经得到content值之后的操作
* 把点击左边条目得到的数据通过bundle传值传递给右边的Fragment
* @Override
*/
public void getContent(String content) {
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
MovieContentFragment fragment = new MovieContentFragment();
Bundle bundle = new Bundle();
bundle.putString("content", content);
//在主Activity中要通过被实例化的Fragment对象的setArguments(Bundle args)方法
//向Fragment传值
fragment.setArguments(bundle);
transaction.replace(R.id.ll_right, fragment);
transaction.commit();
}
}
左边的Fragment,这里我们需要把要填充右边的.txt文件复制到assets文件夹下:
package org.mobiletrain.fragment_demo09;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import android.app.Activity;
import android.app.Fragment;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
public class MovieNameFragment extends Fragment{
//声明一个接口对象
private OnGetContentListener myListener;
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
//在onAttach方法中实例化myListener
myListener = (OnGetContentListener) activity;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.left, null);
ListView listView = (ListView)view.findViewById(R.id.movieList);
listView.setOnItemClickListener(new OnItemClickListener() {
/**
* 通过点击左边不同的条目来获取与条目相对应的assets文件夹下的content内容
* @Override
*/
public void onItemClick(AdapterView> parent, View view,
int position, long id) {
//这里是获取assets文件夹下的txt数据用于填充右边的Fragment
AssetManager asset = getActivity().getResources().getAssets();
try {
//获取读取流
InputStream is = asset.open("movie"+position+".txt");
//获取字节输出流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int len = 0;
byte[]buffer = new byte[1024];
while ((len = is.read(buffer))!=-1) {
baos.write(buffer, 0, len);
baos.flush();
}
String content = new String (baos.toByteArray());
//使接口myListener得到content的值
myListener.getContent(content);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
return view;
}
}
右边的Fragment:
package org.mobiletrain.fragment_demo09;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class MovieContentFragment extends Fragment{
/**
* 获取主Activity传来的Content并显示在TextView中
* @Override
*/
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View view = inflater.inflate(R.layout.right, null);
TextView tv = (TextView)view.findViewById(R.id.content);
tv.setText(getArguments().getString("content"));
return view;
}
}
activity_main.xml文件:
left.xml文件:
right.xml文件:
这里有一个新的知识点就是使用ScrollView来嵌套LinearLayout布局:这样在右边得到的内容中就可以通过滚动查看所有内容,不然会有一些内容看不到,这里
做一下解释,算是一个新的知识点吧。
好了,发一下截图吧: