简体   繁体   中英

Call start startActivityForResult inside class

I need to call startActivityForResult from inside class, but I am getting no java.lang.NullPointerException .

File: SignUpFragment.java

public class SignUpFragment extends Fragment {

    ImageView imageView;


    private OnFragmentInteractionListener mListener;

    public SignUpFragment() {
        // Required empty public constructor

        Test test = new Test();
        test.getImageData();

    }
}

PS: Test.java is not an Activity , its class and I extends Activity to get access to startActivityForResult

file Test.java

public class Test extends Activity {

    public void getImageData() {
        Intent pickIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        pickIntent.setType("image/*");

        startActivityForResult(pickIntent, 1);
    }

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

        Log.d(“Reps”, ”Called”);
    }

}

Update: here is the error log :

mozeh E/AndroidRuntime: FATAL EXCEPTION: main
     Process: com.example.moaaznash.userregistrationmozeh, PID: 28091
     java.lang.NullPointerException
         at android.app.Activity.startActivityForResult(Activity.java:3424)
         at android.app.Activity.startActivityForResult(Activity.java:3385)
         at com.example.moaaznash.mozehlibraryandroid.TestMozeh1.startPhotoLibs(TestMozeh1.java:52)
         at com.example.moaaznash.userregistrationmozeh.SignUpFragment$1.onClick(SignUpFragment.java:101)
         at android.view.View.performClick(View.java:4438)
         at android.view.View$PerformClick.run(View.java:18422)
         at android.os.Handler.handleCallback(Handler.java:733)
         at android.os.Handler.dispatchMessage(Handler.java:95)
         at android.os.Looper.loop(Looper.java:136)
         at android.app.ActivityThread.main(ActivityThread.java:5017)
         at java.lang.reflect.Method.invokeNative(Native Method)
         at java.lang.reflect.Method.invoke(Method.java:515)
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
         at dalvik.system.NativeStart.main(Native Method)

     [ 03-19 10:08:41.231  1615: 1809 D/         ]
     HostConnection::get() New Host Connection established 0xb990e140, tid 1809
public class Test extends Activity {

    public void getImageData() {
        Intent pickIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        pickIntent.setType("image/*");
        if (pickIntent == 1) {
            startActivity(pickIntent);
        }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.d(“Reps”,”Called”);
    }
}

I would tend to put the getImageData() and the onActivityResult to the Activity class containing the Fragment (and communicate between the Activity and Fragment through listeners for instance).

But below is an alternative

public class SignUpFragment extends Fragment {
    private final int PICK_ID = 1;

    public SignUpFragment() {
        // Required empty public constructor
    }

    public static SignUpFragment newInstance() {
        SignUpFragment fragment = new SignUpFragment();
        Bundle args = new Bundle();
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getImageData();
    }

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

        if (requestCode == PICK_ID && resultCode == Activity.RESULT_OK) {
            Log.d("TAG", "onActivityResult");

            if (data != null) {
                try {
                    InputStream inputStream = getActivity().getContentResolver().openInputStream(data.getData());
                    //...
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public void getImageData(){
        Intent pickIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        pickIntent.setType("image/*");

        startActivityForResult(pickIntent, PICK_ID);
    }
}

And in your activity simply put something like this

    public class MainActivity extends AppCompatActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            getSupportFragmentManager()
                     .beginTransaction()
                     .add(android.R.id.content, SignUpFragment.newInstance())
                     .commit();
        }

    }

You are treating Activity like a ordinary Java class, and not like another Activity. Due to this, when you call startActivityForResult() you get a nullpointerexception as the Activity's onCreate() has not been called, which means that its current instance is not valid for calling startActivityForResult().

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM