当前位置: 首页 > 知识库问答 >
问题:

Android finish()结束应用程序,而不是转到以前activity的OnactivityResult

慕容宏毅
2023-03-14

我正试图从服务器获取一些数据。用户单击search,另一个activity由startActivityForResult()启动。当用户单击数据时,数据应该放在intent中,setResult()用该intent完成,并调用finish()。现在我已经尝试了debugg,但是当调用finish()时,activity不会返回到调用这个activity的那个。相反,应用程序关闭了。

这是代码;

public class SearchContactActivity extends AppCompatActivity {

    ProgressBar pb;
    CircleImageView profile_image_search;
    TextView name_search,user_name_search;
    EditText edit_search_contact;
    Button btn_search_contact;
    ConstraintLayout cl;
    String profile_image,firstName,lastName;
    RequestQueue myQueue;
    String url = "working url";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search_contact);

        pb = findViewById(R.id.progressBar);
        profile_image_search = findViewById(R.id.profile_image_search);
        name_search = findViewById(R.id.name_search);
        user_name_search = findViewById(R.id.user_name_search);
        btn_search_contact = findViewById(R.id.btn_search_contact);
        edit_search_contact = findViewById(R.id.edit_search_contact);
        cl = findViewById(R.id.nested_layout);

        cl.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setResultForPreviousAcitvity();
            }
        });
        btn_search_contact.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    search_contacts();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
        hideVisibility();
    }
    public void setResultForPreviousAcitvity()
    {
        Intent data = new Intent();
        data.putExtra("first_name",firstName);
        data.putExtra("last_name",lastName);
        data.putExtra("user_name",user_name_search.getText().toString());
        data.putExtra("profile", profile_image);
        setResult(RESULT_OK,data);
        finish(); // app closes down here
    }
    private void search_contacts() throws JSONException {
        pb.setVisibility(View.VISIBLE);

        //send php data in json array format
        //JSONObject jsonbody = new JSONObject("{\"search_key\":\"jhonsanders \"}");
        HashMap<String, String> params = new HashMap<String, String>();
        params.put("search_key", edit_search_contact.getText().toString().trim());
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest( url,new JSONObject(params), new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                try {
                    JSONArray jsonArray = response.getJSONArray("result");
                    for(int i = 0; i < jsonArray.length(); i++)
                    {
                        JSONObject myobj = jsonArray.getJSONObject(i);
                        firstName = myobj.getString("first_name");
                        lastName = myobj.getString("last_name");
                        String userName = myobj.getString("user_name");
                        profile_image = myobj.getString("profile_image");
                        Bitmap image = NameAndImage.stringToImage(profile_image);
                        show_visibility();
                        profile_image_search.setImageBitmap(image);
                        user_name_search.setText(userName);
                        name_search.setText(firstName+" "+lastName);
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }


            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
            }
        })/*{
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String,String> param = new HashMap<>();
                param.put("search_key",edit_search_contact.getText().toString().trim());
                return param;
            }
        }*/;
        myQueue = VolleySingleton.getInstance(SearchContactActivity.this).getRequestQueue();
        myQueue.add(jsonObjectRequest);

    }
    private void hideVisibility()
    {
        pb.setVisibility(View.INVISIBLE);
        profile_image_search.setVisibility(View.INVISIBLE);
        name_search.setVisibility(View.INVISIBLE);
        user_name_search.setVisibility(View.INVISIBLE);

    }
    private void show_visibility()
    {
        profile_image_search.setVisibility(View.VISIBLE);
        name_search.setVisibility(View.VISIBLE);
        user_name_search.setVisibility(View.VISIBLE);
        pb.setVisibility(View.INVISIBLE);
    }
   /* private Bitmap stringToImage(String s)
    {
        byte[] image = Base64.decode(s,Base64.DEFAULT);
        Bitmap decodedImage = BitmapFactory.decodeByteArray(image,0,image.length);
        return decodedImage;
    }*/

}

上面的activity是由

Intent i = new Intent(ContactsActivity.this,SearchContactActivity.class);
        startActivityForResult(i,REQUEST_CONTACT_SEARCH);

这是舱单

<manifest html" target="_blank">xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.privatechat">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:usesCleartextTraffic="true"
        android:theme="@style/Theme.PrivateChat">
        <activity android:name=".SearchContactActivity"></activity>
        <activity android:name=".ContactsActivity" />
        <activity android:name=".NameAndImage" />
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <uses-library
            android:name="org.apache.http.legacy"
            android:required="false" />
    </application>

    <uses-permission android:name="android.permission.INTERNET" />

</manifest>

没有可以打印的日志。调用onfinish()时,将清除日志。

这个应用程序回到了另一个activity。这一个也有一个activityresult,但它不是称为另一个activity的那个。

public class NameAndImage extends AppCompatActivity {

    EditText editFirstName,editLastName;
    ImageView profile_image;
    Button uploadNameImage;
    Bitmap image;
    RequestQueue myQueue;
    SaveSharedPreference sp = new SaveSharedPreference();

    private String URL = "working url";
    public static final int PICK_IMAGE_REQUEST = 1011;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_name_and_image);
        editFirstName = findViewById(R.id.edit_first_name);
        editLastName = findViewById(R.id.edit_last_name);
        profile_image = findViewById(R.id.profile_image_search);
        uploadNameImage = findViewById(R.id.upload_name_image);
        Log.i("SharedPreference",sp.getUserName(NameAndImage.this).trim());

        profile_image.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                pickPhoto();
            }
        });

        uploadNameImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                uploadData();
            }
        });
    }
    private void pickPhoto()
    {
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_PICK);
        intent.setType("image/*");
        startActivityForResult(intent,PICK_IMAGE_REQUEST);
    }
    private  void uploadData()
    {
        StringRequest upload_data = new StringRequest(Request.Method.POST, URL,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        if(response.trim().equals("success_data_upload"))
                        {
                            Toast.makeText(NameAndImage.this, "upload success", Toast.LENGTH_SHORT).show();
                            Intent i = new Intent(NameAndImage.this,ContactsActivity.class);
                            startActivity(i);
                        }
                        if(response.trim().equals("Error"))
                        {
                            Toast.makeText(NameAndImage.this, "upload error", Toast.LENGTH_SHORT).show();
                            Log.i("server",response.toString());
                        }
                        else
                        {
                            Toast.makeText(NameAndImage.this, "Response dont match", Toast.LENGTH_SHORT).show();
                            Log.i("server",response);
                        }

                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(NameAndImage.this, error.toString(), Toast.LENGTH_SHORT).show();
                        Log.i("server",error.toString());
                    }
                }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String,String> param = new HashMap<>();
                param.put("image",imageToString(image));
                param.put("first_name",editFirstName.getText().toString());
                param.put("last_name",editLastName.getText().toString());
                param.put("user_name",sp.getUserName(NameAndImage.this).trim());
                return param;
            }
        };
        upload_data.setRetryPolicy(new DefaultRetryPolicy(
                3000,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT
        ));
        myQueue = VolleySingleton.getInstance(NameAndImage.this).getRequestQueue();
        myQueue.add(upload_data);
    }
    public static String imageToString(Bitmap pic)
    {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        pic.compress(Bitmap.CompressFormat.JPEG,100,byteArrayOutputStream);
        byte[] imageByte = byteArrayOutputStream.toByteArray();
        return Base64.encodeToString(imageByte,Base64.DEFAULT);
    }
    public static Bitmap stringToImage(String s)
    {
        byte[] image = Base64.decode(s,Base64.DEFAULT);
        Bitmap decodedImage = BitmapFactory.decodeByteArray(image,0,image.length);
        return decodedImage;
    }

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

        if(requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK)
        {
            Uri uri = data.getData();

            try {
                image = MediaStore.Images.Media.getBitmap(getContentResolver(),uri);
                profile_image.setImageBitmap(image);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

编辑:应用程序似乎关闭,但2秒后,错误的activity启动。

共有1个答案

邓正谊
2023-03-14

在setResult()中设置结果时,我将包含image的string profile放入字符串。我想字符串真的很大,但是当我调试时,整个字符串似乎都在那里。所以当我让profile清空时,应用程序运行正常。看来我将不得不将字符串分成2个以获得更多的效果。

 类似资料:
  • Python新手在这里。我正在编写一个简单的客户端/服务器程序,要求用户输入姓名、用户名、电子邮件地址、密码。此信息被发送到服务器,服务器将检查此用户的文本文件中是否已经有条目。如果有,它应该发送一条消息回来说这个用户已经存在,要求用户再试一次。 我设置了一个名为标志的变量为False。我对照文本文件检查用户信息,如果在文件中没有找到匹配,我将标志设置为true。然后我有一个if语句,它说如果标志

  • 给定以下使用多线程的Java示例: 它产生: 但应用程序永远不会终止。 我是不是该加入这条线什么的?

  • 我有一些代码,使用JSoup和连接到一个网站成功的Java。 我试图在Android上复制完全相同的东西(作为学习体验)。 我的JAVA代码中没有任何错误,并且已经确认它在JAVA(运行在Netbeans中)中仍然可以工作 我在libs文件夹中有我的JSoup jar~这是一个花了一点时间才找到的问题。 我已经放置了一些edittext.settext(“here”);查看代码的位置。 我试过这两

  • 我正在尝试使用Prometheus在Kubernetes上监视Spring Boot应用程序。Promethus正在使用Helm,而我正在使用Spring Boot执行器进行健康检查、审计、度量收集和监控。 致动器给出了应用的详细说明。例如: 在输出下方返回

  • 假设您有一个应用程序A和一个线程类,如: 从A开始,您可以从以下内容开始线程: 那么当应用程序A完成时,MyThread是否也停止?否则,如何确保它会被中断?

  • 为什么Rest控制器会抛出BindException或返回空的ModelandView? 注意:我正在使用curl测试我的web应用程序,并制作一个HTTP POST 我有意省略了“name”参数,这是一个用@Notnull和@Notblank注释标记的必填字段。 我有几个支持类--Task、TaskCommand、Error和ErrorsList--如果需要,我可以发布代码。