从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);
SecondActivity
从CameraActivity
接收Uri
,Uri
也必须传回上一个。 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的主要内容,如果未能解决你的问题,请参考以下文章