0

我一直在尝试从厨房中选取图像并将其设置为ImageView。我成功地去了画廊和挑选图像,但无法将其设置为ImageView。实际上,我不能在我写的Fragment类中写入OnActivityResult。以下是该课程的代码。无法在片段类中写入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(); 
    } 

} 

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

+0

'我无法在Fragment类中写入OnActivityResult ..为什么?请添加更多细节。我的应用程序在片段上有onActivityResult并且工作正常。 – Psypher

回答

0

在碎片和活动中单独保留您的视图而不是“交叉使用”它们通常是一种很好的模式。

由于NilayDani评论上面,你可以这样做:

getActivity().startActivityForResult(galleryIntent, RESULT_LOAD_IMG); 

而且.onActivityResult可以在活动中使用。

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

建议尽量保持您的callerPic仅在Fragment中进行交互,当然如果可能的话。