无法在片段类中编写onActivityResult函数

时间:2015-06-20 11:10:47

标签: android android-fragments android-imageview android-fragmentactivity android-gallery

我一直在尝试从厨房中挑选一张图片并将其设置为ImageView。我成功进入画廊并选择图像,但无法将其设置为ImageView。实际上,我无法在我编写的Fragment类中编写OnActivityResult。下面是该类的代码。

public class MainActivity extends FragmentActivity {

// create object of FragmentPagerAdapter
SectionsPagerAdapter mSectionsPagerAdapter;
String imgDecodableString;
ImageView callerPic;// = (ImageView) findViewById(R.id.callerPic);
// viewpager to display pages
ViewPager mViewPager;
final static int cameraData = 0;
private static int RESULT_LOAD_IMG = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.slideview_fragment);

    // Create the adapter that will return a fragment for each of the five
    // primary sections of the app.
    mSectionsPagerAdapter = new SectionsPagerAdapter(
            getSupportFragmentManager());

    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setAdapter(mSectionsPagerAdapter);

}

/**
 * A FragmentPagerAdapter that returns a fragment corresponding to one of
 * the sections/tabs/pages.
 */
public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        // getItem is called to instantiate the fragment for the given page.
        // Return a DummySectionFragment (defined as a static inner class
        // below) with the page number as its lone argument.

        switch (position + 1) {
            case 1:

                Fragment fragment1 = new Fragment1();
                return fragment1;
            case 2:

                Fragment fragment2 = new Fragment2();
                return fragment2;


            default:
                Fragment fragment = new Fragment1();
                return fragment;
        }
    }

    @Override
    public int getCount() {
        // Show 5 total pages.
        return 2;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
            case 0:
                return "Fake CALL";
            case 1:
                return "Fake SMS";

        }
        return null;
    }
}



public static class Fragment1 extends Fragment {


    public Fragment1() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {


        View view = inflater.inflate(R.layout.activity_main, container, false);
//THIS PART OF THE CODE I AM HAVING TROUBLE WITH
        ImageView callerPic = (ImageView) view.findViewById(R.id.callerPic);
        callerPic.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent galleryIntent = new Intent(Intent.ACTION_PICK,
                        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                // Start the Intent
                startActivityForResult(galleryIntent, RESULT_LOAD_IMG);

            }
        });

        return view;

    }
}

public static class Fragment2 extends Fragment {

    public Fragment2() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.activity_main2, container, false);

        return view;
    }
 }
}

我必须在Fragment1类中编写onActivityResult方法,但我无法在其中编写。

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    try {
        // When an Image is picked
        if (requestCode == RESULT_LOAD_IMG && resultCode == RESULT_OK
                && null != data) {
            // Get the Image from data

            Uri selectedImage = data.getData();
            String[] filePathColumn = { MediaStore.Images.Media.DATA };

            // Get the cursor
            Cursor cursor = getContentResolver().query(selectedImage,
                    filePathColumn, null, null, null);
            // Move to first row
            cursor.moveToFirst();

            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            imgDecodableString = cursor.getString(columnIndex);
            cursor.close();

            // Set the Image in ImageView after decoding the String
            callerPic.setImageBitmap(BitmapFactory
                    .decodeFile(imgDecodableString));

        } else {
            Toast.makeText(this, "You haven't picked Image",
                    Toast.LENGTH_LONG).show();
        }
    } catch (Exception e) {
        Toast.makeText(this, "Something went wrong", Toast.LENGTH_LONG)
                .show();
    }

}

任何人都可以帮忙解决这个问题吗? 感谢。

1 个答案:

答案 0 :(得分:0)

这通常是一种很好的模式,可以将您的观点分别保留在片段和活动中,而不是“交叉使用”#34;它们。

正如NilayDani在上面评论过的,你可以这样做:

getActivity().startActivityForResult(galleryIntent, RESULT_LOAD_IMG);

.onActivityResult可以在你的Activity中使用。

但是要小心,当您使用片段视图,即ImageView callerPic时,请确保此视图可用且片段已创建且处于活动状态。如果您不注意Activity-Fragment生命周期,这很容易导致崩溃。

作为建议尝试让callerPic只与片段进行交互,如果可能的话。