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.