从android中的派生类更新父类(包括导航视图)中声明的imageview

Posted

技术标签:

【中文标题】从android中的派生类更新父类(包括导航视图)中声明的imageview【英文标题】:Updating imageview declared in parent class(which includes Navigation view) from derived class in android 【发布时间】:2017-04-01 23:56:02 【问题描述】:

场景: 包含导航抽屉布局的基类,该布局与通常的应用程序一样具有标题部分。标题包括一个 imageview 和 textview。在我的情况下,还有另一个活动可以说 Profile 从基类扩展,并且我现在不想更改此父/子行为。

问题: 配置文件活动具有更新服务器上的配置文件图像的 api 调用。在获得成功响应后,我只想更新导航抽屉ImageView,无论用户返回其他活动还是保留在个人资料活动中。

到目前为止我尝试过的是:

将 Base Activity 中的 ImageView 声明为静态并尝试使用 Picasso 更新 Profile Activity api 响应中的图像。

将 Base Activity 中的 ImageView 声明为静态并尝试使用 imageview.setBitmap() 方法。

尝试在 Volley 成功方法中使用基类的实例,并在我尝试更新 ImageView 时使用基类的方法。

尝试在 api 成功响应中使用 runOnUiThread() 但没有成功。 This 在我的情况下没有意义,因为用户在按下后退按钮时可能不会进入基本活动。下面是 Profile Activity 中的一段代码,我正在尝试更新 Base Activity 中的图像

   private void uploadImage() 
   
    if (bm == null) 
        uploadProfile();
    
    else 
        String REGISTER_URL = new SharedPreferenceManager(getApplicationContext()).getKeyFromSharedPrefFile("MySharedPrefs", "globalURL") + "users/mobileupload";
        
        StringRequest stringRequest = new StringRequest(Request.Method.POST, REGISTER_URL,
                new Response.Listener<String>() 
                    @Override
                    public void onResponse(String s) 
                        navBarImage.setImageBitmap(bitmap); // where navBarImage is declared in BaseActivity Layout Navigation drawer in header layout
                     
                ,
                ....

        requestQueue.add(stringRequest);
    

Api 调用工作正常,如果我注销并再次登录,图像正在上传和更新顺利。 现在我的问题是是否有办法能够立即更新父类的视图......如果是,你能提供一些例子吗?

【问题讨论】:

【参考方案1】:

据我了解,SecondActivity 设置了包括添加图像在内的信息。所以任务的目标是自动更新FirstActivity's抽屉的ImageView。我们不能只调用SecondActivity 中的视图,因为活动应该独立工作(这意味着——它们不能相互认识)。

我相信这是 onActivityResult() 的一个很好的用例,因为我们想要从 SecondActivity 传回结果。我们需要传递的信息是Uri-- uri 代表设备中的图像位置。

SecondActivity

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) 
    super.onActivityResult(requestCode, resultCode, data);
     if (requestCode == SELECT_FILE && resultCode == RESULT_OK && data != null && data.getData() != null) 
            filePath = data.getData();

            // We will pass the value at the previous activity using this code
            Intent responseValue = new Intent();
            responseValue.putExtra(PROFILE_URI_KEY, filePath);
            setResult(Activity.RESULT_OK, responseValue);
     

SecondActivityCameraActivity 接收UriUri 也必须传回上一个。 Activity,以便它可以执行 Drawer'a Image 的失效。

MainActivity

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    super.onActivityResult(requestCode, resultCode, data);
    Log.e(TAG, "We receive someting " + requestCode + " " + (resultCode == Activity.RESULT_OK));
    if (requestCode == RESUL_KEY_FOR_EDIT && resultCode == Activity.RESULT_OK) 

        Uri uri = (Uri) data.getParcelableExtra(EditProfile.PROFILE_URI_KEY);
        Picasso.with(getApplicationContext())
                .load(uri)
                .fit().
                centerCrop()
                .noFade()
                .error(R.drawable.placeholder)
                .into(navBarImage);
    

在我们的MainActivity 中,由于性能改进,我们使用 Picasso 进行图像加载。

【讨论】:

让我试试 onActivityResult 方法...我想这种方法应该可行... 你是对的,startActivityResult 成为唯一的出路......也尝试了界面,但对我不起作用...... 很高兴知道:)【参考方案2】:

为此,您可以做的是: 首先,创建一个接口并在“Base Activity”中实现。然后将此接口的实例传递给Derived Activity,一旦您从服务器获得响应,调用该接口方法将更新后的图像发送到BaseActivity。 在您已覆盖接口方法的 BaseActivity 中,使用 Picasso 更新图像。 希望对您有所帮助。

【讨论】:

以上是关于从android中的派生类更新父类(包括导航视图)中声明的imageview的主要内容,如果未能解决你的问题,请参考以下文章

为啥不能从派生类对象访问父类的赋值运算符

类的继承

获取派生类以显示与派生类的父类具有聚合关系的抽象类中的变量的 C++ 错误

PHP中继承

打字稿:使父类中的公共方法成为派生类中的私有/受保护方法

初识MFC----视图窗口类CView