簡體   English   中英

getActivity().startActivityForResult() 在片段中不起作用

[英]getActivity().startActivityForResult() is not working in fragments

我在 Fragment 中工作,我需要從圖庫中選擇一個圖像並將其設置為 imageView 但 getActivity().startActivityForResult() 現在正在工作

我已經檢查了許多鏈接,但所有人都說在父活動中調用此方法,但我沒有任何父活動,因為此片段位於另一個片段內。 我也檢查了這個鏈接

startActivityForResult 在 Fragment 中不起作用

這是我的代碼:-

主要活動類:-

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);
    }

}

這是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

    }

}

這是我必須更改圖像的嵌套片段:-

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);
}

請讓我知道我在這里做錯了什么???

更新

我確實更新了SabaKuchHomeActivityProfileSettingFragment

問題是您正在 Fragment 中實現onActivityResult並調用getActivity().startActivityForResult(...) 因為您是從 Activity 啟動 Activity,所以onActivityResult(...)方法調用會轉到啟動新 Activity 的 Activity。

所以你需要做的就是刪除getActivity()部分,你的 onActivityResult(...) 將在你的 Fragment 中被調用!

編輯:正如您從 GrepCode 中看到的, FragmentstartActivityForResult 中的代碼與ActivitystartActivityForResult 不同 這絕對不是巧合......

你不應該使用

getActivity().startActivityForResult(...)

只需使用

startActivityForResult(...)

這樣您的片段中的onActivityResult將被調用。

這在詳細討論這里和在博客這里並沒有關於它的bug報告在這里

簡短的版本是:這對於嵌套片段已損壞,您必須編寫自己的解決方法。

我的建議是在你的孩子片段調用中:

getParentFragment().startActivityForResult(....)

並在您的父 Fragment 覆蓋 onActivityResult 並重播對您的子 Fragment 的調用:

...
for (Fragment child : getChildFragmentManager().getFragments()) {
   child.onActivityResult(requestCode, resultCode, data);
}
...

試試看,當您調用 startActivityForResult() 時,首先調用 Activity 的 onActivityResult(),然后調用其片段的 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);
      }
    }
  }
}

您片段的 onActivityResult() 中的代碼看起來像這樣,嘗試從 fragmentManager 或在您的 viewPagerAdapter 的幫助下獲取片段也嘗試將 startActivityForResult 調用為,

fragment.getParentFragment().startActivityForResult();

代替

fragment.startActivityForResult();

把它放在你的外部片段中以訪問當前加載的片段,

MyFragment myFragment = (MyFragment)pagerAdapter.getCurrentFragment();
myFragment.myMethod();

適配器中的以下代碼將返回當前加載的片段,請記住以下僅供您理解,請相應地在您的代碼中使用它

Fragment fragment;

@Override
public Fragment getItem(int index) {
    fragment = new FragFilter();
    return fragment;
}

public Fragment getCurrentFragment() {
    return this.fragment;
}

消除

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    }

在您的活動和第一個片段中,並在嵌套片段中維護它

並且即使沒有工作,在將片段初始化為時傳遞您的活動實例

fragment = new ProfileSettingFragment(activity);

並在片段中創建一個與活動實例一起使用的構造函數,然后您可以在主活動中調用 onActivityResult 並且可以在初始化片段時傳遞活動引用時從該活動獲取數據。

您可以創建一個接口,該接口的方法將返回一個字符串,並通過在您的活動中實現該方法,您可以通過您的活動引用可用的位置接收數據。

出於某種原因,當您從

android.support.v4.app.Fragment

不起作用,它會轉到您的活動 onActivityResult。 如果你使用

android.app.Fragment

它將工作並返回到您在 Fragment 中的 onActivityResult。

雖然我沒有測試你的代碼。 我代表我寫這個答案。

getActivity.startActivityForResult(...)

應該調用 Activity onActivityResult。

getParentFragment().onActivityResult(...)

應該在您的父片段中調用 onActivityResult 。

this.onActivityResult(...)

應該調用您當前的片段 onActivityResult() 方法。

您可以嘗試此處提到的這些關鍵字。 如果您仍然遇到問題,請告訴我我將在 GIT 上提供代碼示例

嘗試這個:

getContext().getApplicationContext.startActivityforResult();

在您的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);
    }

如果您使用自定義片段或/和 viewpager,請使用 getParentFragment(),否則請使用 getParentFragment()

簡單的解決方案只調用startActivityForResult(/* … */)並且onActivityResult(/* … */)在您的片段中將被調用。 我通常用這個。

我們也可以在您的 Fragment 中實現onActivityResult()

非常喜歡您的代碼,只需刪除getActivity. getActivity.startActivityForResult(...)然后它會調用你的片段的onActivityResult() 有關更多信息,請參閱此鏈接 享受你的代碼:)

它變成了一個更長的代碼,我只會做一個簡短的演練 -(因為它是賞金),僅此而已。 這是我使用的 xml。 剩下的爪哇

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>

我所做的只是創建一個名為ActivityResHaninterface ,它只有一個名為initiate(String fragmentTag); 我的名字很差 - 我知道)邏輯是讓我的直接Fragment -(包含視圖頁面或通奸並有孩子的孩子的片段)實現這個ActivityResHan interface

class ViewPagerFragment extends Fragment implements ActivityResHan{

這將調用startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST); 從內容提供者檢索聯系人。

@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);
    }

這個direct-FragmentonActivityResult檢查calleer是否為空 -(我希望你已經見過 calleer )如果不是,則它為他/她的孩子調用onActivityResult ,並通過FragmentManager.findFragmentByTag();通過Tag識別其孩子FragmentManager.findFragmentByTag(); 這就是calleer進來的地方

現在direct-Fragment每個孩子,當它需要為結果啟動一個活動時,只需通過Tag找到direct-Fragment -( viewpageframent ) 然后將該FragmentActivityResHan並調用initiate(fragmentTag);

((ActivityResHan)getActivity().getSupportFragmentManager().
                            findFragmentByTag("viewpageframent")).initiate(getTag());

其余的代碼使這一切都發生了

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);
    }
 }

}

希望能幫助到你。

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)
}
 

在您的片段中覆蓋此方法

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
}

並將活動變量存儲為類的成員。 這樣,您將始終獲得系統提供的正確活動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM