简体   繁体   English

在类内部调用start startActivityForResult

[英]Call start startActivityForResult inside class

I need to call startActivityForResult from inside class, but I am getting no java.lang.NullPointerException . 我需要从类内部调用startActivityForResult ,但没有得到java.lang.NullPointerException

File: SignUpFragment.java 文件: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 PS: Test.java不是Activity ,而是其类,我扩展了Activity以获得对startActivityForResult访问权限

file Test.java 文件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). 我倾向于将getImageData()和onActivityResult放到包含Fragment的Activity类中(并通过侦听器在Activity和Fragment之间进行通信)。

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. 您将Activity视为普通的Java类,而不是另一个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(). 因此,当您调用startActivityForResult()时,会得到nullpointerexception异常,因为尚未调用Activity的onCreate(),这意味着其当前实例对于调用startActivityForResult()无效。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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