fragment intent中怎样getIntent()

Android中fragment之间和Activity的传值、切换-Beyond平君-酷辣虫 -
恋人絮语发布过的帖子
Android中fragment之间和Activity的传值、切换 - Beyond平君
时间: 20:46
1分钟注册,结交更多好友,享用更多功能,轻松玩转酷辣虫!
才可以下载或查看,没有帐号?
qEbquuv.jpg (28.13 KB, 下载次数: 116)
20:46 上传
&&功能介绍:通过一个 activity 下方的三个按钮,分别是发送消息( sendButton )、聊天记录( chatButton )、常用语 (commonButton) 。当单击按钮是,来切换上方的 fragment ,用以显示不同的内容。
所用的知识点:当单击发送消息按钮时:
&&1. 从 MainActivity 中把 EditText 中的值传到 fragment 中。
&&2. fragment 如何动态的显示在MainActivity中。& &
qEbquuv.jpg (60.3 KB, 下载次数: 105)
20:46 上传
&&针对第一个问题:在 sendButton 单击事件中:
private OnClickListener sendListener = new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
&&// 获取 fragment1 中的 text 控件 , 可以在 MainActivity 中直接获取 fragment 中的控件
&&TextView showView=(TextView)findViewById(R.id.showtextviewId);
&&// 得到 EditText 中的内容
String message = editText.getText().toString();
//getIntent().putExtra(&str&, message);
//String temp = getIntent().getStringExtra(&str&);
str = str.append(message).append(&n&);
String text=
if(str.length()&100){
text = str.substring(str.length()-100, str.length()-1).toString();
text = str.toString();
&&// 将获取的值放置到 intent 中,方便以后再 fragment 中获取
&&getIntent().putExtra(&chatStr&, str.toString());
showView.setText(text);
&&针对第二个问题:
&&// 申明 FragmentManager 对象,和 FragmentTransaction
private FragmentM
private FragmentTra
&&// 获取两个对象的方法
manager = getSupportFragmentManager();
transaction = manager.beginTransaction();
&&// 必须先初始化一个 fragment ,防止获取不到对应 fragment 中控件
&&// 将要加载到MainActivity中 fragment 实例化对象
fragment_sendContent f1 = new fragment_sendContent();
&&// 第一个参数是 main_activity.xml 中的 FrameLayout 的对象
transaction.add(R.id.frameLayout_content, f1);
&&// 加入到后台栈中
transaction.addToBackStack(null);
&&// 事务必须提交
当单击聊天记录按钮时:现象:获取到前面所有发送的内容。
所用到的知识点:
&&1. 如何获取MainActivity中的数据(刚才发送的数据放在MainActivity中的数组中)
&&2. 从一个 fragment 切换到另一个 fragment 中。
qEbquuv.jpg (64.68 KB, 下载次数: 121)
20:46 上传
&&针对第一个问题:
&&先看在 sendListener 事件中:
&&// 将获取的值放置到 intent 中,方便以后再 fragment 中获取
&&getIntent().putExtra(&chatStr&, str.toString());
&&在历史记录的 fragment.java 中:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
&&// 加载对应的 fragment ,这里是 history_record
View contentView = inflater.inflate(R.layout.history_record, null);
contentView.setBackgroundColor(Color.MAGENTA);
&&// 获取这个 fragment 中的控件的方法
&&textView = (TextView) contentView.findViewById(R.id.recordTextViewId);
&&// 获取MainActivity中的数据
&&String chatString = getActivity().getIntent().getStringExtra(&chatStr&);
textView.setText(chatString);
return contentV
&&针对第二个问题:
&&fragment 的动态切换:
private OnClickListener chatListener = new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
fragment_HistoryRecord historyRecord = new fragment_HistoryRecord();
transaction = manager.beginTransaction();
transaction.replace(R.id.frameLayout_content, historyRecord);
transaction.addToBackStack(null);
当单击常用语按钮时:现象:弹出经常使用的用语(实现最麻烦)。
所用到的知识点:
&&1. 利用 ListView 控件显示常用语
&&2. 如何将数据放置到 ListView 中
&&3. 熟悉 SimpleAdapter 、 Map,ArrayList 之间的配合使用
&&4. 从一个 fragment 切换到另一个 fragment 中。(不赘述)
qEbquuv.jpg (47.56 KB, 下载次数: 107)
20:46 上传
&&针对第一个问题:
&&新建一个 xml 文件,里面加上一个 ListView 即可。
&&针对第二个问题:
&&// 三个全局变量
private ListView listV
private String[]
private EditText editT
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View contentView = inflater.inflate(R.layout.fragment_listview, null);
&&// 获取 fragment 中的控件对象
listView = (ListView) contentView.findViewById(monLanguageId);
&&// 第一个参数:
&&// 第二个参数:是一个 List 参数
&&// 第三个参数:另一个布局文件,其中用一个 textView 控件来显示每一条 listview 中信息
&&// 第四个参数:
&&// 第五个参数:
&&SimpleAdapter simpleAdapter = new SimpleAdapter(getActivity().getApplicationContext(),
&&getData(), R.layout.show_item, new String[]{&common&}, new int[]{R.id.item});
listView.setAdapter(simpleAdapter);
return contentV
&&// 将申明的几个常用语加入到 ArrayList 中,使用键值对
public ArrayList getData(){
ArrayList list = new ArrayList();
strs = new String[]{
&&& 小孩 &,& 小姐 &,& 小东王 &,& 江西 &,& 你好! &
&p&for(int i=0;i
上一主题: 下一主题: 本帖标题:本帖地址:
不回帖的给脑残下了定义!
iEcola技术控的帖子越来越有深度了!
星期日的心情很不错啊
看起来好像不错的样子
没人回帖。。。我来个吧
写得实在太好了,我唯一能做的就是默默顶贴!
系统居然说我是在灌水,我有吗?
走过路过请支持下!
吹牛的人越来越多了!
酷辣虫发布的Android中fragment之间和Activity的传值、切换 - Beyond平君帖子由网友提供或转载于网络,若发布的Android中fragment之间和Activity的传值、切换 - Beyond平君侵犯了您的权益,请联系我们.Android activity跳转到另一个activity的指定fragment页面
最近在做一个项目用了activity跳转到fragment,所以就在网上找了很多的列子。
下面先看几张图:
首页、简介、和设置都是fragment碎片。在mainactivity里面。而testactivity是一个独立的activity
现在要做的就是从testactivity跳转到简介这个fragment里面。
首先我们在testactivity的跳转事件里面给mainactivity传个名为id的参数。Intent intent=new Intent(TestActivity.this,MainActivity.class);
intent.putExtra( id , 1);
startActivity(intent);然后在mainactivity里面我们接收一下这个id值
int id = getIntent().getIntExtra( id , 0);
再判断这个id值是否为1,若id=1那么我们让mainactivity加载简介这个fragment
nt id = getIntent().getIntExtra( id , 0);
if (id==1) {
Fragment fragmen = new Infofragment();
FragmentManager fmanger =getFragmentManager();
FragmentTransaction ftran =fmanger.beginTransaction();
ftran.replace(R.id.franme_meun,fragmen);
info_meun.setChecked(true);
li.setVisibility(View.GONE);
}上面代码中info_meun.setChecked(true);就是设置底部导航的选中状态。不要忘记了,否则你的底部导航选中的是其他的
你上面的fragment显示的是简介。。
需要demo的加我QQ
Android activity跳转到另一个activity的指定fragment页面由用户自行发布,Android activity跳转到另一个activity的指定fragment页面内容不代表本站立场,请自行分辨真伪。12407人阅读
漏洞分析(8)
为了适应越来越大的设备屏幕,Android在3.X后引入了Fragment概念,作用是可以在一个屏幕上同时显示多个Activity,以达到充分利用屏幕的目的。关于Fragment的使用说明,可以阅读。其中,Fragment有一个很强大的功能,就是可以动态加载。这样可以让整个界面的开发更加灵活,可以根据不同的场景动态加加载不同的Activity。
回到今天的主题——利用Fragment实现注入攻击。从3.X后,android工程师重构PreferenceActivity的实现,采用Fragment实现界面的加载。通过阅读源码可以发现,PreferenceActivity的onCreate里,需要读取Intent的多个extra内容,常量都定义在PreferenceActivity里(那堆EXTRA_XXXX就是了),其中有两个常量分别是EXTRA_SHOW_FRAGMENT=&:android:show_fragment&和EXTRA_SHOW_FRAGMENT_ARGUMENTS=&:android:show_fragment_args&,这两个参数可以决定当前的PreferenceActivity首次显示的Fragment。过程比较简单,就是先拿到fragment_class和fragment_args,然后通过反射生成一个Fragment实例,并动态加载。关键源码如下所示:
mSinglePane = hidingHeaders || !onIsMultiPane();
String initialFragment = getIntent().getStringExtra(EXTRA_SHOW_FRAGMENT);
Bundle initialArguments = getIntent().getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
int initialTitle = getIntent().getIntExtra(EXTRA_SHOW_FRAGMENT_TITLE, 0);
int initialShortTitle = getIntent().getIntExtra(EXTRA_SHOW_FRAGMENT_SHORT_TITLE, 0);
先获取initalFragment和initialArguments两个参数,之后在switchToHeaderInner里完成实例化:
private void switchToHeaderInner(String fragmentName, Bundle args, int direction) {
getFragmentManager().popBackStack(BACK_STACK_PREFS,
FragmentManager.POP_BACK_STACK_INCLUSIVE);
Fragment f = Fragment.instantiate(this, fragmentName, args);
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
transaction.replace(com.android.internal.R.id.prefs, f);
mitAllowingStateLoss();
到此为止,我们可以通过设置Intent的extral,实现动态修改PreferenceActivity的初次显示的Fragment。
我们知道,在Android系统里,App与App是互相隔离的,互相之间不能访问对方的私有数据。App与App之间(更准确地说应该是组件与组件之间)的通讯,统一使用Intent。通过Intent可以很方便的唤起其他App的Activity,达到功能重用的目的。比如平时使用ZAKER,你需要在微信圈里分享,通过这种方式就可以直接跳到微信的分享界面了。但使用这种方式的前提是目标Activity是的。
结合上面的两个关键点,我们是否可以寻找一个exported的PreferenceActivity的子类,并通过精心设置Intent的extral的值,以实现打开那些没有exported的界面呢?如果这些界面涉及安全方面信息的话,又会怎样呢?
Setting几乎每个Android设备都有的。Setting是以system_uid方式签名,所以具备行使system的权力。它的主界面com.android.settings.Settings就是继承自PreferenceActivity,而且肯定是exported。我们以此作为入口,尝试寻找Setting里有哪些重要的Fragment,并尝试把它加载进来,主要目的是希望可以跳过某些需要用户交互的限制。比如说ChooseLockPassword$ChooseLockPasswordFragment这个Fragment,这个类主要是负责锁屏界面的密码设定和修改。同时,这个类会根据之前传入的initialArguments做不同的逻辑,关键代码如下所示:
Intent intent = getActivity().getIntent();
final boolean confirmCredentials = intent.getBooleanExtra(&confirm_credentials&, true);
if (savedInstanceState == null) {
updateStage(Stage.Introduction);
if (confirmCredentials) {
mChooseLockSettingsHelper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST,
null, null);
mFirstPin = savedInstanceState.getString(KEY_FIRST_PIN);
final String state = savedInstanceState.getString(KEY_UI_STAGE);
if (state != null) {
mUiStage = Stage.valueOf(state);
updateStage(mUiStage);
如果传入的参数当中,key为&confirm_credentials&为true,就会调起旧密码验证的流程。如果为false,就可以跳过旧密码验证而直接进入密码修改的流程。测试代码如下所示:
Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.setClassName(&com.android.settings&, &com.android.settings.Settings&);
intent.putExtra(&:android:show_fragment&, &com.android.settings.ChooseLockPassword$ChooseLockPasswordFragment&);
intent.putExtra(&confirm_credentials&, false);
startActivity(intent);
正常的密码修改流程是&设置&-&&安全&-&&屏幕锁定&-&&确认你的PIN&,如所下图所示:
如果运行DEMO,则直接进入如下界面:
这样你直接输入密码,就可以把原来的密码覆盖掉了。
这个BUG存在于3.X到4.3中的所有版本,4.4已经fix了。4.4强制所有PreferenceActivity必须要实现isValidFragment方法,详细见
个人总结:
应该说,这种修复方式,只是起到一个提醒的作用,最终的安全还是交由开发者承担。另外,目前很多应用都是基于2.X的,所以要兼容在4.4上跑而不crash,只要在PreferenceActivity的子类都补充加上isValidFragment方法就可以了。但对于4.4之前的版,如果存在这种权限泄露的问题,还是需要单独处理的。下面给出兼容2.X~4.4修复的代码示例:
public final class MyPreferenceActivity extends PreferenceActivity {
private boolean doValidcheck(String fragmentName) throws IllegalArgumentException{
//TODO 做合法性检查
//添加上这个方法,以使2.x~4.3的代码在4.4上可以正常运行
protected boolean isValidFragment(String fragmentName) {
return doValidcheck(fragmentName);
protected void onCreate(Bundle savedInstanceState) {
//在onCreate前就做合法性判断
String fragmentname = getIntent().getStringExtra(&:android:show_fragment&);
doValidcheck(fragmentname);
super.onCreate(savedInstanceState);
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:259627次
积分:2850
积分:2850
排名:第7322名
原创:29篇
评论:340条
(1)(1)(1)(2)(2)(8)(1)(8)(2)(8)

我要回帖

更多关于 intent跳转到fragment 的文章

 

随机推荐