[英]getActivity().startActivityForResult() is not working in fragments
I am working in Fragment in which I need to select an image from gallery and set it to an imageView but getActivity().startActivityForResult() is now working
我在 Fragment 中工作,我需要从图库中选择一个图像并将其设置为 imageView 但 getActivity().startActivityForResult() 现在正在工作
I have already checked many Links but all are saying that call this method in parent activity but I dont have any parent activity as this fragment is inside a another fragment.
我已经检查了许多链接,但所有人都说在父活动中调用此方法,但我没有任何父活动,因为此片段位于另一个片段内。 I have checked this link too
我也检查了这个链接
startActivityForResult is not working in Fragment startActivityForResult 在 Fragment 中不起作用
Here is my code :-这是我的代码:-
MainActivity Class:-
主要活动类:-
public class SabaKuchHomeActivity extends FragmentActivity {
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;
// nav drawer title
private CharSequence mDrawerTitle;
// used to store app title
private CharSequence mTitle;
// slide menu items
private String[] navMenuTitles;
private TypedArray navMenuIcons;
private ArrayList<NavDrawerItem> navDrawerItems=new ArrayList<NavDrawerItem>();
private NavDrawerListAdapter adapter;
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.home_activity);
mTitle = mDrawerTitle = getTitle();
// load slide menu items
navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);
// nav drawer icons from resources
navMenuIcons = getResources()
.obtainTypedArray(R.array.nav_drawer_icons);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.list_slidermenu);
// adding nav drawer items to array
// Home
navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1)));
// Find People
navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1)));
// Photos
navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1)));
// Communities, Will add a counter here
navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons.getResourceId(3, -1), true, "22"));
// Pages
navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuIcons.getResourceId(4, -1)));
// What's hot, We will add a counter here
navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons.getResourceId(5, -1), true, "50+"));
navDrawerItems.add(new NavDrawerItem(navMenuTitles[6], navMenuIcons.getResourceId(6, -1)));
// Recycle the typed array
navMenuIcons.recycle();
mDrawerList.setOnItemClickListener(new SlideMenuClickListener());
// setting the nav drawer list adapter
adapter = new NavDrawerListAdapter(getApplicationContext(),
navDrawerItems);
mDrawerList.setAdapter(adapter);
// enabling action bar app icon and behaving it as toggle button
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
//getActionBar().setDisplayShowHomeEnabled(false);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.drawable.ic_drawer, //nav menu toggle icon
R.string.app_name, // nav drawer open - description for accessibility
R.string.app_name // nav drawer close - description for accessibility
) {
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void onDrawerClosed(View view) {
getActionBar().setTitle(mTitle);
//getActionBar().show();
// calling onPrepareOptionsMenu() to show action bar icons
invalidateOptionsMenu();
}
public void onDrawerOpened(View drawerView) {
getActionBar().setTitle(mDrawerTitle);
// calling onPrepareOptionsMenu() to hide action bar icons
//getActionBar().hide();
invalidateOptionsMenu();
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
if (savedInstanceState == null) {
// on first time display view for first nav item
displayView(0);
}
}
/**
* Slide menu item click listener
* */
private class SlideMenuClickListener implements
ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// display view for selected nav drawer item
displayView(position);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// toggle nav drawer on selecting action bar app icon/title
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
// Handle action bar actions click
switch (item.getItemId()) {
case R.id.action_search:
Intent TrendIntent = new Intent(SabaKuchHomeActivity.this,TrendsActivity.class);
startActivity(TrendIntent);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
/* *
* Called when invalidateOptionsMenu() is triggered
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// if nav drawer is opened, hide the action items
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
menu.findItem(R.id.action_search).setVisible(!drawerOpen);
return super.onPrepareOptionsMenu(menu);
}
/**
* Diplaying fragment view for selected nav drawer list item
* */
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@SuppressLint("NewApi")
private void displayView(int position) {
// update the main content by replacing fragments
android.support.v4.app.Fragment fragment = null;
switch (position) {
case 0:
fragment = new OzoneFragment();
break;
case 1:
fragment = new MyZoneFragment();
break;
case 2:
fragment = new BizZoneFragment();
break;
case 3:
fragment = new EventsFragment();
break;
case 4:
fragment = new PrivacySettingFragment();
break;
case 5:
fragment = new ProfileSettingFragment(); ***This is the fragment where I am moving now***
break;
case 6:
AppContoller.getInstance().pref=getSharedPreferences(AppContoller.getInstance().PREF_NAME, 0);
Editor editer=AppContoller.getInstance().pref.edit();
editer.putString(AppContoller.getInstance().USER_ID, "0");
editer.commit();
finish();
break ;
default:
break;
}
if (fragment != null) {
android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.frame_container, fragment).commit();
// update selected item and title, then close the drawer
mDrawerList.setItemChecked(position, true);
mDrawerList.setSelection(position);
setTitle(navMenuTitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);
} else {
// error in creating fragment
Log.e("MainActivity", "Error in creating fragment");
}
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
public void setTitle(CharSequence title) {
mTitle = title;
getActionBar().setTitle(mTitle);
}
/**
* When using the ActionBarDrawerToggle, you must call it during
* onPostCreate() and onConfigurationChanged()...
*/
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Pass any configuration change to the drawer toggls
mDrawerToggle.onConfigurationChanged(newConfig);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
} }
here is
ProfileSettingFragment()
fragment :-这是
ProfileSettingFragment()
片段:-
@SuppressLint("NewApi")
public class ProfileSettingFragment extends android.support.v4.app.Fragment implements TabListener {
private ViewPager mPager;
private MyPageAdapter adapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View rootView = inflater.inflate(R.layout.profile_setting_fragment, container, false);
mPager=(ViewPager)rootView.findViewById(R.id.pager);
mPager.setOffscreenPageLimit(5);
adapter=new MyPageAdapter(getChildFragmentManager());
mPager.setAdapter(adapter);
TabPageIndicator indicater=(TabPageIndicator)rootView.findViewById(R.id.indicator1);
indicater.setViewPager(mPager);
indicater.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
});
/*mPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
});*/
/*actionBar.addTab(actionBar.newTab().setText("Home").setTabListener(this));
actionBar.addTab(actionBar.newTab().setText("MiZone").setTabListener(this));
actionBar.addTab(actionBar.newTab().setText("Top Trending").setTabListener(this));
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);*/
return rootView;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
private class MyPageAdapter extends FragmentStatePagerAdapter
{
private List<android.support.v4.app.Fragment> fragments;
public MyPageAdapter(FragmentManager fm) {
super(fm);
// TODO Auto-generated constructor stub
this.fragments=new ArrayList<android.support.v4.app.Fragment>();
fragments.add(new ProfileGeneralSetting());
fragments.add(new ProfileOzoneSetting());
fragments.add(new ProfileMyzoneSetting());
fragments.add(new ProfileBizzoneSetting());
fragments.add(new ProfilePasswordSetting());
}
@Override
public android.support.v4.app.Fragment getItem(int arg0) {
// TODO Auto-generated method stub
return fragments.get(arg0);
}
@Override
public CharSequence getPageTitle(int position) {
// TODO Auto-generated method stub
switch (position) {
case 0:
return "General";
case 1:
return "Ozone";
case 2:
return "MyZone";
case 3:
return "Biz Zone";
case 4 :
return "Password Setting";
}
return null;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return fragments.size();
}
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
mPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
}
here is Nested Fragment from where I have to change the image :-
这是我必须更改图像的嵌套片段:-
public class ProfileOzoneSetting extends Fragment implements MiFeelingBase, OnClickListener{
NetworkImageView genSetOzoneUserImage;
private ArrayList<String>arrCategoryId=new ArrayList<String>();
List<String> interestList = new ArrayList<String>();
String[] interest;
Boolean setImg ;
private static final int SELECT_PICTURE = 1;
private String selectedImagePath;
Button SettingOzSave;
private MultipartEntity reqEntity;
String[] y ={""};
private String strUserID;
ImageLoader imageLoader = AppContoller.getInstance().getImageLoader();
OzoneSettingData ozSettingList = new OzoneSettingData();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// TODO Auto-generated method stub
View rootView = inflater.inflate(R.layout.profiesettingozone, container, false);
genSetOzoneUserImage = (NetworkImageView)rootView.findViewById(R.id.genSetOzoneUserImage);
SettingOzSave = (Button)rootView.findViewById(R.id.SettingOzSave);
SettingOzSave.setOnClickListener(this);
genSetOzoneUserImage.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.d("first time", "before method");
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
//startActivityForResult(Intent.createChooser(intent,"Select Picture"), SELECT_PICTURE);
Log.d("first time", "before method11");
//startActivityForResult(intent, SELECT_PICTURE);
getParentFragment().startActivityForResult(intent, SELECT_PICTURE);
//startActivityForResult(intent, SELECT_PICTURE);
//((SabaKuchHomeActivity)getActivity()).startActivitForResult(intent, SELECT_PICTURE);
//getContext().getApplicationContext.startActivityforResult(intent, SELECT_PICTURE);
//fragment.getApplicationContext.startActivityforResult(intent, SELECT_PICTURE);
//getActivity().startActivityForResult(intent, SELECT_PICTURE);
//startActivityForResult(intent, SELECT_PICTURE);
//((SabaKuchHomeActivity)getActivity()).startActivitForResult(intent, SELECT_PICTURE);
Log.d("first time", "before method22");
}
});
APIAccess.fetchData(ProfileOzoneSetting.this, getActivity(), getActivity());
return rootView;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d("first time", "before method33");
super.onActivityResult(requestCode, resultCode, data);
Log.d("first time", "before method44");
if (requestCode == SELECT_PICTURE && resultCode ==Activity.RESULT_OK && null != data) {
Uri selectedImage = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getActivity().getContentResolver().query(selectedImage,
filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
genSetOzoneUserImage.setImageBitmap(BitmapFactory.decodeFile(picturePath));
setImg = true;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
AppContoller.getInstance().pref=getActivity().getSharedPreferences(AppContoller.getInstance().PREF_NAME, 0);
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
}
public String getPath(Uri uri) {
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = getActivity().managedQuery(uri, projection, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
Please let me know what mistake I am doing here???请让我知道我在这里做错了什么???
Update更新
I did update SabaKuchHomeActivity
and ProfileSettingFragment
我确实更新了
SabaKuchHomeActivity
和ProfileSettingFragment
The problem is that you are implementing onActivityResult in your Fragment and calling getActivity().startActivityForResult(...) .问题是您正在 Fragment 中实现onActivityResult并调用getActivity().startActivityForResult(...) 。 Because you are launching Activity from Activity, the onActivityResult(...) method call goes to the Activity that launches new Activity.
因为您是从 Activity 启动 Activity,所以onActivityResult(...)方法调用会转到启动新 Activity 的 Activity。
So all you need to do is remove the getActivity() part and your onActivityResult(...) will be called in your Fragment!所以你需要做的就是删除getActivity()部分,你的 onActivityResult(...) 将在你的 Fragment 中被调用!
EDIT: As you can see from GrepCode, the code in Fragment 's startActivityForResult is different from Activity 's startActivityForResult .编辑:正如您从 GrepCode 中看到的, Fragment的startActivityForResult 中的代码与Activity的startActivityForResult 不同。 That sure ain't coincidence....
这绝对不是巧合......
You should not use你不应该使用
getActivity().startActivityForResult(...)
Simply use只需使用
startActivityForResult(...)
This way the onActivityResult
in your fragment will be called.这样您的片段中的
onActivityResult
将被调用。
This is discussed in detail here and blogged about here and there is a bug report about it here .这在详细讨论这里和在博客这里并没有关于它的bug报告在这里。
The short version is: This is broken for nested fragements and you have to write your own workaround.简短的版本是:这对于嵌套片段已损坏,您必须编写自己的解决方法。
My suggestion would be to in your child fragment call:我的建议是在你的孩子片段调用中:
getParentFragment().startActivityForResult(....)
and in your parent Fragment override onActivityResult and replay the call to your child fragments:并在您的父 Fragment 覆盖 onActivityResult 并重播对您的子 Fragment 的调用:
...
for (Fragment child : getChildFragmentManager().getFragments()) {
child.onActivityResult(requestCode, resultCode, data);
}
...
Give it a try, When you call startActivityForResult(), onActivityResult() of the Activity is first called then onActivityResult() of its fragment is called but this call is not given to the nested fragment.试试看,当您调用 startActivityForResult() 时,首先调用 Activity 的 onActivityResult(),然后调用其片段的 onActivityResult(),但不会将此调用提供给嵌套片段。 So in onActivityResult() of your fragment you will have to get the current loaded fragment somehow, typecast it if needed and then call a method written inside it to which you pass whatever you get OnActivityResult().
因此,在您的片段的 onActivityResult() 中,您必须以某种方式获取当前加载的片段,如果需要,则对其进行类型转换,然后调用写入其中的方法,您将获得 OnActivityResult() 的任何内容传递给该方法。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// notifying nested fragments (support library bug fix)
final FragmentManager childFragmentManager = getChildFragmentManager();
if (childFragmentManager != null) {
final List < Fragment > nestedFragments = childFragmentManager.getFragments();
if (nestedFragments == null || nestedFragments.size() == 0) return;
for (Fragment childFragment: nestedFragments) {
if (childFragment != null && !childFragment.isDetached() && !childFragment.isRemoving()) {
childFragment.onActivityResult(requestCode, resultCode, data);
}
}
}
}
Code in your fragment's onActivityResult() would look something like, Try to get the fragment from fragmentManager or with the help of your viewPagerAdapter Also try to call startActivityForResult as,您片段的 onActivityResult() 中的代码看起来像这样,尝试从 fragmentManager 或在您的 viewPagerAdapter 的帮助下获取片段也尝试将 startActivityForResult 调用为,
fragment.getParentFragment().startActivityForResult();
instead of代替
fragment.startActivityForResult();
Put this in your outer fragment to access the current loaded fragment,把它放在你的外部片段中以访问当前加载的片段,
MyFragment myFragment = (MyFragment)pagerAdapter.getCurrentFragment();
myFragment.myMethod();
And the below code in the adapter which will return the current fragment loaded, remember below is just for you to understand, use it in your code accordingly适配器中的以下代码将返回当前加载的片段,请记住以下仅供您理解,请相应地在您的代码中使用它
Fragment fragment;
@Override
public Fragment getItem(int index) {
fragment = new FragFilter();
return fragment;
}
public Fragment getCurrentFragment() {
return this.fragment;
}
Remove消除
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
in your activity and first fragment and maintain this in your nested fragment在您的活动和第一个片段中,并在嵌套片段中维护它
and Even if not worked pass your activity instance while intializing fragment as并且即使没有工作,在将片段初始化为时传递您的活动实例
fragment = new ProfileSettingFragment(activity);
and create a constructor in fragment what your using with activity instance then you can call onActivityResult in main activity and can get data form that activity as you are passing activity reference while initializing your fragment.并在片段中创建一个与活动实例一起使用的构造函数,然后您可以在主活动中调用 onActivityResult 并且可以在初始化片段时传递活动引用时从该活动获取数据。
You can create an interface which have a method will return a string and by implementing that in your activity you can receive the data through over where your activity reference available.您可以创建一个接口,该接口的方法将返回一个字符串,并通过在您的活动中实现该方法,您可以通过您的活动引用可用的位置接收数据。
For some reason when you startActivityForResult from出于某种原因,当您从
android.support.v4.app.Fragment
wont work, it will go to your Activities onActivityResult.不起作用,它会转到您的活动 onActivityResult。 If you use
如果你使用
android.app.Fragment
it will work and return to your onActivityResult in Fragment.它将工作并返回到您在 Fragment 中的 onActivityResult。
Although i didn't test your code.虽然我没有测试你的代码。 I am writing this answer on my behalf.
我代表我写这个答案。
getActivity.startActivityForResult(...)
should call Activity onActivityResult.应该调用 Activity onActivityResult。
getParentFragment().onActivityResult(...)
should call onActivityResult in your parent fragment.应该在您的父片段中调用 onActivityResult 。
And和
this.onActivityResult(...)
should should call your current fragment onActivityResult() method.应该调用您当前的片段 onActivityResult() 方法。
you can try these keyword as mentioned here.您可以尝试此处提到的这些关键字。 In case you still face problem let me know i'll a code sample on GIT
如果您仍然遇到问题,请告诉我我将在 GIT 上提供代码示例
尝试这个:
getContext().getApplicationContext.startActivityforResult();
override onActivityResult
in your SabaKuchHomeActivity
use在您的
SabaKuchHomeActivity
使用中覆盖onActivityResult
public void dispatchTakePictureIntent() {
final int TAKE_PHOTO_RESULT_CODE = 2345;
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent
.resolveActivity(getActivity().getPackageManager()) != null)
if (getParentFragment() != null)
getParentFragment().startActivityForResult(takePictureIntent, TAKE_PHOTO_RESULT_CODE);
else
startActivityForResult(takePictureIntent, TAKE_PHOTO_RESULT_CODE);
}
public void dispatchChoosePictureIntent() {
final int CHOOSE_PHOTO_RESULT_CODE = 1234;
Intent intent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*");
if (getParentFragment() != null)
getParentFragment().startActivityForResult(Intent.createChooser(intent, "Choose Picture"),
CHOOSE_PHOTO_RESULT_CODE);
else
startActivityForResult(Intent.createChooser(intent, "Choose Picture"),
CHOOSE_PHOTO_RESULT_CODE);
}
Use getParentFragment() if you are using custom fragment or/and viewpager, otherwise igonre/remove getParentFragment()如果您使用自定义片段或/和 viewpager,请使用 getParentFragment(),否则请使用 getParentFragment()
Simple solution just call the startActivityForResult(/* … */)
only and onActivityResult(/* … */)
in your fragment will be called.简单的解决方案只调用
startActivityForResult(/* … */)
并且onActivityResult(/* … */)
在您的片段中将被调用。 I usually use this.我通常用这个。
we can also implement onActivityResult()
in your Fragment as well.我们也可以在您的 Fragment 中实现
onActivityResult()
。
so dear for your code just remove getActivity.
非常喜欢您的代码,只需删除
getActivity.
from getActivity.startActivityForResult(...)
then it will calls onActivityResult()
of your fragment.从
getActivity.startActivityForResult(...)
然后它会调用你的片段的onActivityResult()
。 for more information see this link .有关更多信息,请参阅此链接。 enjoy your code:)
享受你的代码:)
It became a longer code ,i will just do a brief walkthrough -(since its a bounty) and that's all.它变成了一个更长的代码,我只会做一个简短的演练 -(因为它是赏金),仅此而已。 here is the xml i used.
这是我使用的 xml。 the rest java
剩下的爪哇
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res/rumorsapp.ghaweek"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="rumorsapp.ghaweek.MainActivity" >
<android.support.design.widget.TabLayout
android:id="@+id/tablayou"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:background="#ff9900"
android:minHeight="50dp"
app:tabIndicatorColor="#f09"
app:tabMode="scrollable"
app:tabPadding="10dp"
app:tabSelectedTextColor="#004"
app:tabTextColor="#fff" >
</android.support.design.widget.TabLayout>
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_marginTop="2dp"
android:layout_below="@+id/tablayou"
android:layout_height="match_parent"/>
</RelativeLayout>
All i did to make it work was create an interface
called ActivityResHan
which simply had a method called initiate(String fragmentTag);
我所做的只是创建一个名为
ActivityResHan
的interface
,它只有一个名为initiate(String fragmentTag);
( my names are poor -i know ) the logic was to have my direct Fragment
-( fragment containing the viewpager or the Child that fornicated and has kids ) implement this ActivityResHan
interface
(我的名字很差 - 我知道)逻辑是让我的直接
Fragment
-(包含视图页面或通奸并有孩子的孩子的片段)实现这个ActivityResHan
interface
class ViewPagerFragment extends Fragment implements ActivityResHan{
which was to going to call the startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
这将调用
startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
to retrieve a Contact from the content provider.从内容提供者检索联系人。
@Override
public void initiate(String fragmentTag) {
calleer = fragmentTag; //this calleer saves the tag
Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));
pickContactIntent.setType(Phone.CONTENT_TYPE);
startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
}
This direct-Fragment
's onActivityResult
checks if calleer
is empty -( i hope you have already met calleer ) if its not then it calls the onActivityResult
for his/her children, and it recognises its children by Tag
, through FragmentManager.findFragmentByTag();
这个
direct-Fragment
的onActivityResult
检查calleer
是否为空 -(我希望你已经见过 calleer )如果不是,则它为他/她的孩子调用onActivityResult
,并通过FragmentManager.findFragmentByTag();
通过Tag
识别其孩子FragmentManager.findFragmentByTag();
that's where calleer
comes in这就是
calleer
进来的地方
and now Every Child of the direct-Fragment
, when it needs to start an activity for result just finds the direct-Fragment
by Tag
-( viewpageframent ) and then cast that Fragment
to ActivityResHan
and calls initiate(fragmentTag);
现在
direct-Fragment
每个孩子,当它需要为结果启动一个活动时,只需通过Tag
找到direct-Fragment
-( viewpageframent ) 然后将该Fragment
为ActivityResHan
并调用initiate(fragmentTag);
((ActivityResHan)getActivity().getSupportFragmentManager().
findFragmentByTag("viewpageframent")).initiate(getTag());
The rest of the codes makes it all happen .其余的代码使这一切都发生了。
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.support.annotation.Nullable;
import android.support.design.widget.TabLayout;
import android.support.design.widget.TabLayout.OnTabSelectedListener;
import android.support.design.widget.TabLayout.Tab;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
/*
* FOr simplicity i added compacted classes, but the idea is, it is suppose
* to work even if you have separate clases. you may even reslove to getting
* rid of the interface, and using request code, as the tag. so you can
* identify them there.
*/
//i am in my separate class
interface ActivityResHan{
void initiate(String fragmentTag);
}
//i am in my separate class
public class MainActivity extends AppCompatActivity {
String ANDROID_PAGER_TAG_REFERER = "android:switcher:2131296359:";
ViewPager mViewPager;
TabLayout tabl;
FrameLayout fl;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
fl = new FrameLayout(this);
fl.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
fl.setId(2);
setContentView(fl);
getSupportFragmentManager().beginTransaction().
add(2,new ViewPagerFragment(), "viewpageframent").commit();
}
//i am in my separate class
private class ViewPagerFragment extends Fragment implements ActivityResHan{
static final int PICK_CONTACT_REQUEST = 1;
String calleer = "";
@Override
@Nullable
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.activity_main, null);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onViewCreated(view, savedInstanceState);
tabl = (TabLayout) view.findViewById(R.id.tablayou);
mViewPager = (ViewPager) view.findViewById(R.id.pager);
tabl.setTabsFromPagerAdapter(new FragmentPAdapt());
mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabl));
tabl.setOnTabSelectedListener(new OnTabSelectedListener() {
@Override
public void onTabUnselected(Tab arg0) {
}
@Override
public void onTabSelected(Tab arg0) {
mViewPager.setCurrentItem(arg0.getPosition());
}
@Override
public void onTabReselected(Tab arg0) {
}
});
}
@Override
public void initiate(String fragmentTag) {
calleer = fragmentTag;
Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));
pickContactIntent.setType(Phone.CONTENT_TYPE);
startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
}
@Override
public void onActivityResult(int requestCode, int resultCode,
Intent data) {
if(!calleer.isEmpty()){
Fragment fg =getSupportFragmentManager().findFragmentByTag(calleer);
fg.onActivityResult(requestCode, resultCode, data);
calleer = "";
}else{
//run my own shit
super.onActivityResult(requestCode, resultCode, data);
}
}
}
//i am in my separate class
private class FragmentPAdapt extends FragmentPagerAdapter{
private class Thefrag extends Fragment{
TextView t;
public Thefrag() {
super();
}
@Override
@Nullable
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
// TODO Auto-generated method stub
LinearLayout v = new LinearLayout(MainActivity.this);
v.setBackgroundColor(Color.WHITE);
t = new TextView(MainActivity.this);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);
lp.gravity = Gravity.CENTER_VERTICAL|Gravity.FILL_VERTICAL;
t.setLayoutParams(lp);
t.setText(" This is frag " +getTag().subSequence(
getTag().length()-1,
getTag().length()));
t.setTextSize(15f);
v.setClickable(true);
v.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
((ActivityResHan)getActivity().getSupportFragmentManager().
findFragmentByTag("viewpageframent")).initiate(getTag());
}
});
v.addView(t);
return v;
}
@Override
public void onActivityResult(int requestCode, int resultCode,
Intent data) {
// TODO Auto-generated method stub
t.setText(" Contact uri is = " + data.getDataString());
super.onActivityResult(requestCode, resultCode, data);
}
}
public FragmentPAdapt() {
super(getSupportFragmentManager());
mViewPager.setAdapter(this);
}
@Override
public Fragment getItem(int arg0) {
Fragment f = getSupportFragmentManager().findFragmentByTag(
ANDROID_PAGER_TAG_REFERER + String.valueOf(arg0));
if(f == null){
return new Thefrag();
}
return f;
}
@Override
public int getCount() {
return 10;
}
@Override
public CharSequence getPageTitle(int position) {
return "FRAGMENT "+String.valueOf(position);
}
}
}
Hope it helps.希望能帮助到你。
In Kotlin
In Activity :-
private var fragment: Fragment? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.fragment_activity)
fragment = Fragment()
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
fragment?.onActivityResult(requestCode, resultCode, data)
}
In Fragment :-
button.setOnClickListener {
activity?.startActivityForResult(Intent(parentActivity,
SecondActivity::class.java), REQUEST_CODE)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
val string = data?.getStringExtra("SELECTED_NAME")
Log.e("Name", "$string")
}
In SecondActivity :-
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
android.R.id.home -> finish()
R.id.action_filter_apply -> {
val intent = Intent()
intent.putExtra("SELECTED_NAME", "Android")
setResult(Activity.RESULT_OK, intent)
finish()
}
}
return super.onOptionsItemSelected(item)
}
In your fragment override this method在您的片段中覆盖此方法
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
}
and store the activity variable as a member of your class.并将活动变量存储为类的成员。 This way you will always get the right activity, provided by the system.
这样,您将始终获得系统提供的正确活动。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.