怎么在一个fragment or 任意类中js 操作另一个htmlfragment中的方法

关于Fragment与Fragment、Activity通信的四种方式
博客专家
关于Fragment与Fragment、Activity通信的四种方式
一直想总结一下Fragment与Fragment、Activity通信的问题,今天有时间一共总结了三种,权当抛砖引玉,如果大家还有更好的方式来实现Fragment和Fragment、Activity的通信,欢迎提出来,我们一起学习。好了,我们先来看看今天要实现的一个效果图:左边是一个Fragment,右边是一个Fragment,当我们点击左边的Fragment的时候,右边的Fragment中显示出我们所点击的人的作品,我们就来看看怎样实现两个Fragment之间的通信。1.直接在一个Fragment中调用另外一个Fragment中的方法我们可以直接在一个Fragment中调用另外一个Fragment的公开方法,前提是要先拿到另外一个Fragment的实例,我们先来看看怎样在左边的Fragment中拿到右边Fragment的实例:ContentFragment cf = (ContentFragment) getActivity()
.getFragmentManager().findFragmentById(
R.id.content_fg);
cf.showPro(name);我们通过宿主Activity拿到FragmentManager,进而再拿到右边的Fragment,然后调用右边Fragment里边的showPro方法,其中要传入的参数是左边点击的人名,我们看看右边Fragment中的showPro方法: public void showPro(String key) {
list = map.get(key);
adapter = new ArrayAdapter&String&(getActivity(),
android.R.layout.simple_list_item_1, list);
lv.setAdapter(adapter);
}先根据传进来的人名拿到该人作品的数据集,然后构造一个adapter赋值给listview,很简单吧。使用这种方式我们可以直接在一个Fragment中调用另一个Fragment的公开方法,从而实现两个Fragment的通信。这种方法适于那些我们在布局文件中就已经定义了的Fragment,这种Fragment每个都有id,可以通过FragmentManager找到,但是如果我们使用了ViewPager,即每个Fragment都是动态添加进来的,这个时候我们无法通过FragmentManager获得另外一个Fragment的实例,那么该怎么办呢?这时我们就要用到下面这种方式了。2.使用接口接口可以实现两个Fragment之间的通信,也可以实现Fragment和Activity之间的通信,这大概是用的比较多的一种方式,也是个人比较推荐的一种方式,使用接口来实现两个Fragment之间通信,要通过宿主Activity中转一下,如果是Fragment和宿主Activity通信则直接调用即可,我们先看看上图中点击韩愈的时候怎么出现他的作品。首先在左边的Fragment中定义一个接口: public interface showPro {
public void showProByName(String name);
}然后定义一个接口变量:private showPro mC我们要在宿主Activity中实现这个接口,这样当Fragment调用onAttach方法时我们就可以实例化这个接口了: @Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (activity != null) {
mCallback = (showPro)
}当mCallback实例化之后,那么我们在点击韩愈的时候就可以调用这里边的showProByName方法了:
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView&?& parent, View view,
int position, long id) {
TextView nameTV = (TextView)
String name = nameTV.getText().toString();
if (&韩愈&.equals(name)) {
mCallback.showProByName(name);
});当然,这个方法的具体实现在宿主Activity中,当宿主Activity实现了showPro接口之后,接着就要实现它里边的方法了:public class MainActivity extends Activity implements showPro {
private ContentF
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getActionBar().hide();
cf = (ContentFragment) getFragmentManager().findFragmentById(
R.id.content_fg);
public void showProByName(String name) {
cf.showPro(name);
}我们在接口的方法中调用右边Fragment中的showPro方法,并将当前人名作为参数传入,这个方法与1中相同,我就不贴代码了。这个方法与1中介绍的方法相比,虽然有点麻烦,但是可以有效的解决在一个Fragment中拿不到另一个Fragment实例的问题,具体应用场景就是ViewPager中的Fragment之间通信。3.使用广播不论我们有没有用ViewPager,都可以用广播实现两个Fragment之间的通信,广播算是这里最灵活的通信方式了,我们看看在左边Fragment中发送广播:Intent intent = new Intent(&showPro&);
intent.putExtra(&name&, name);
LocalBroadcastManager.getInstance(getActivity())
.sendBroadcast(intent);在右边Fragment中接收广播:
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager
.getInstance(getActivity());
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(&showPro&);
BroadcastReceiver br = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String key = intent.getStringExtra(&name&);
list = map.get(key);
adapter = new ArrayAdapter&String&(getActivity(),
android.R.layout.simple_list_item_1, list);
lv.setAdapter(adapter);
localBroadcastManager.registerReceiver(br, intentFilter);这些都是广播基本的使用方法,我就不啰嗦了。个人觉得,虽然广播用起来最方便,但是在选择使用哪种通信方式的时候,优先选择上面两种,如果前两种方式都不可以,再考虑使用广播。续:之前还忽略了一种,这里补充一下。4.Fragment直接调用Activity中的public方法我们也可以直接在Fragment中调用Activity中的公开方法,如下:((MainActivity) getActivity()).showProByName(name);这里的showProByName就是我们上文贴出来的那个MainActivity中的方法。如果大家还有更好的实现两个Fragment通信的方式,欢迎提出来,一起学习。
我的热门文章
即使是一小步也想与你分享下次自动登录
现在的位置:
& 综合 & 正文
关于Loader,activity,Fragment之间的一个使用
* CopyRight 2014 ZhuYan
* @author Zhu Yan
* All right reserved
* Created on
下午3:29:13
package com.zhuyan.
import com.mengqi.base.R;
import android.content.C
import android.database.C
import android.os.B
import android.support.v4.app.F
import android.support.v4.app.LoaderManager.LoaderC
import android.support.v4.content.AsyncTaskL
import android.support.v4.content.L
import android.text.E
import android.text.TextW
import android.view.LayoutI
import android.view.V
import android.view.ViewG
import android.widget.EditT
* @author Zhu Yan
* Created on
下午3:29:13
public class TestFragment extends Fragment implements LoaderCallbacks&Cursor&
private EditText viewEditT
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
viewEditText = (EditText) inflater.inflate(R.layout.name_filter, null);
return viewEditT
public void onActivityCreated(Bundle savedInstanceState)
super.onActivityCreated(savedInstanceState);
getLoaderManager().initLoader(0, null, this);
//对于EditText内容进行监听。然后重启查询器
viewEditText.addTextChangedListener(new TextWatcher()
public void onTextChanged(CharSequence s, int start,
int before, int count)
public void beforeTextChanged(CharSequence s, int start,
int count, int after)
public void afterTextChanged(Editable s)
//变换内容后 重启Loader
getActivity().getSupportLoaderManager().restartLoader(0, null, TestFragment.this);
public Loader&Cursor& onCreateLoader(int arg0, Bundle arg1)
if(arg0 == 0){
return new TestLoader(getActivity());
public void onLoadFinished(Loader&Cursor& arg0, Cursor arg1)
System.out.println("loader finished ");
public void onLoaderReset(Loader&Cursor& loader)
loader.reset();
* 这是个异步加载的Loader
* 熟悉AsyncTask的应该知道。
* 所以必须覆写loadInBackground();方法。
* loadInBackground()是在异步线程执行的。
* @author Zhu Yan
* Created on
下午3:35:49
private static class TestLoader extends AsyncTaskLoader&Cursor&{
* @param context
public TestLoader(Context context)
super(context);
// TODO Auto-generated constructor stub
public Cursor loadInBackground()
* 必须调用。要不然这个Loader不去加载
protected void onStartLoading()
// LogUnit.Log(TAG, "onStartLoading:");
forceLoad();
对于TestFragment 我们启动的时候调用onActivityCreated()方法中调用getLoaderManager().initLoader(0, null, this);去启动Loader
然后当EditView的文字改变后。我们又getActivity().getSupportLoaderManager().restartLoader(0, null, TestFragment.this);去重启Loader。
然后我按home键退出。然后再进入该界面。这样会去触发loader重新加载。我发现打印了2遍loader finished.
也就是存在2个loader实例。Api中明确说了。对于同一个Id的Loader只有一个实例存在与一个LoaderManager中。
最后对比getActivity().getSupportLoaderManager().restartLoader(0, null, TestFragment.this); 与getLoaderManager().initLoader(0, null, this);
然后才发现。虽然TestFragment挂载在activity上。但是fragment的LoaderManager跟Activity的LoaderManager不一样。
在我的中变现为 TestLoader实例化在fragment一个和activity中一个。导致2个相同id的TestLoader存在于不同的LoaderManager中。
所以导致执行2遍。
public void afterTextChanged(Editable s)
//变换内容后 重启Loader
getLoaderManager()..restartLoader(0, null, TestFragment.this);
这样改就出现问题了。
&&&&推荐文章:
【上篇】【下篇】菜鸟问一问关于android 开发的问题 在activity上用一个按钮控制fragment的切换?
怎么样实现用一个按钮控制fragment的切换,点击那个按钮就切换到指定的fragment 上去
在按钮上设置一个Listener,然后重载onClick函数,函数里面设置fragment切换。比如switchButton = (Button) rootView.findViewById(R.id.fragment_switch_button);
switchButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.current_fragment, new NewFragment())
.addToBackStack(null);
.commit();
已有帐号?
无法登录?
社交帐号登录

我要回帖

更多关于 fragment 中操作menu 的文章

 

随机推荐