• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

Android

android 获取当前fragment单个对象

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/Android/2019/0818/605.html

 
手机App外包做fragment返回的时候,因为fragment里不能直接写onKeyDown方法,所以只能在fragmentactivity里操作(我本人的fragment都是依附在fragmentactivity上的,通过tabhost显示出来)。在这边有两种方法: 
方法一:在这边只要取得到当前的fragment单个对象就可以实现了,再用instanceof进行查明是哪个fragment。 
贴代码:
 
@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK) {
Fragment ft = (Fragment) getSupportFragmentManager().findFragmentById(R.id.realtabcontent);//realtabcontent为你的容器,装载fragment的if (ft instanceof HomeFragment || ft instanceof PersonalFragment) {if ((System.currentTimeMillis() - mExitTime) > 2000) {
Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
mExitTime = System.currentTimeMillis();
} else {
finish();
}return true;
} else if (ft instanceof LoginFragment) {
((LoginFragment) ft).onKeyDown(keyCode, event);//onKeyDown在LoginFragment里面覆盖了,App开发培训只是随便down了一个方法而已.......return false;
} else if (ft instanceof RegisterFragment) {
((RegisterFragment) ft).onKeyDown(keyCode, event);return false;
}
 
 
}return super.onKeyDown(keyCode, event);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
方法二:自定义一个BackHandledFragment,在写一个BackHandledInterface接口,通过这个接口,可以调用BackHandledFragment里面的ononBackPressed()。 
BackHandledFragment.java
 
package com.example.demo.fragment;import com.example.sihaiproject.interfaces.BackHandledInterface;import android.os.Bundle;import android.support.v4.app.Fragment;public abstract class BackHandledFragment extends Fragment {protected BackHandledInterface mBackHandledInterface;/**
* 所有继承BackHandledFragment的子类都将在这个方法中实现物理Back键按下后的逻辑
* FragmentActivity截取到物理返回键点击事件后会首先询问Fragment是否消费该事件
* 如果没有Fragment消息时FragmentActivity自己才会消费该事件
*/public abstract boolean onBackPressed();@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if(!(getActivity() instanceof BackHandledInterface)){throw new ClassCastException("Hosting Activity must implement BackHandledInterface");
}else{this.mBackHandledInterface = (BackHandledInterface)getActivity();
}
}@Overridepublic void onStart() {super.onStart();//告诉FragmentActivity,当前常州网站开发培训Fragment在栈顶mBackHandledInterface.setSelectedFragment(this);
}
 
}
BackHandledInterface.javapackage com.example.demo.interfaces;import com.example.sihaiproject.fragment.BackHandledFragment;public interface BackHandledInterface {public abstract void setSelectedFragment(BackHandledFragment selectedFragment);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
在你的fragment中说明一个private boolean hadIntercept;,然后覆盖
 
@Overridepublic boolean onBackPressed() {if(hadIntercept){return false;
}else{
getFragmentManager().popBackStack();
hadIntercept = true;return true;
}
}
1
2
3
4
5
6
7
8
9
10
在fragmentactivity声明private BackHandledFragment mBackHandedFragment;,然后覆盖setSelectedFragment方法:
 
@Overridepublic void setSelectedFragment(BackHandledFragment selectedFragment) {this.mBackHandedFragment = selectedFragment;
}
1
2
3
4
企业培训覆盖fragmentactivity里的onBackPressed方法:
 
@Overridepublic void onBackPressed() {if (mBackHandedFragment == null || !mBackHandedFragment.onBackPressed()) {if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
finish();
} else {
getSupportFragmentManager().popBackStack();
}
}
}
1
2
3
4
5
6
7
8
9
10
ok!这就是所有的代码了,直接复制到项目里就可以的。 
主要是Fragment ft = (Fragment) getSupportFragmentManager().findFragmentById(R.id.realtabcontent);,这句话的作用就是获取当前fragment对象。 
也可以通过findfragmentbyid或findfragmentbttag来获取。 
onKeyDown和onBackPressed虽然都有return的作用,但是他们是有区别的。
 

上篇:上一篇:Android底部导航bar不同风格实现
下篇:下一篇:在Android中Activity界面跳转