Android 如何在运行时将图像从gallery绑定到imageView?
我有一个关于做whatsapp克隆的家庭作业。但我有个问题。我有一个添加联系人屏幕。用户从gallery中选择图像并输入其名称。当他们单击添加按钮时,列表项将添加到聊天活动中。截图如下。我有一个person类,比如:Android 如何在运行时将图像从gallery绑定到imageView?,android,xamarin,xamarin.android,Android,Xamarin,Xamarin.android,我有一个关于做whatsapp克隆的家庭作业。但我有个问题。我有一个添加联系人屏幕。用户从gallery中选择图像并输入其名称。当他们单击添加按钮时,列表项将添加到聊天活动中。截图如下。我有一个person类,比如: public class Person { private int id; private string name; private int imageId; public Person(int id, string name, int imageId) { this.i
public class Person
{
private int id;
private string name;
private int imageId;
public Person(int id, string name, int imageId)
{
this.id = id;
this.name = name;
this.imageId = imageId;
}
public int Id // property
{
get { return id; } // get method
set { id = value; } // set method
}
public string Name // property
{
get { return name; } // get method
set { name = value; } // set method
}
public int ImageId // property
{
get { return imageId; } // get method
set { imageId = value; } // set method
}
public static explicit operator Java.Lang.Object(Person v)
{
throw new NotImplementedException();
}
}
public类PersonAdapter:BaseAdapter
{
私人停车场;
私人列表人物列表;
公共角色适配器(活动、列表角色列表)
{
this.mInflater=(LayoutInflater)activity.GetSystemService(Context.LayoutInflaterService);
this.personArrayList=personArrayList;
}
public override int Count=>personArrayList.Count;
公共覆盖对象GetItem(int位置)
{
返回(对象)personArrayList.ElementAt(位置);
}
公共覆盖长GetItemId(int位置)
{
返回位置;
}
公共覆盖视图GetView(int位置、视图转换视图、视图组父视图)
{
convertView=mInflater.Inflate(Resource.Layout.List_项,空);
TextView personName=(TextView)convertView.FindViewById(Resource.Id.name);
TextView personMessage=(TextView)convertView.FindViewById(Resource.Id.message);
ImageView personImage=(ImageView)convertView.FindViewById(Resource.Id.ImageView);
Person=personArrayList.ElementAt(位置);
personName.Text=person.Name;
if(MainActivity.messages[person.Id].Count!=0)
{
personMessage.Text=MainActivity.messages[person.Id][MainActivity.messages[person.Id].Count-1];
}
其他的
{
personMessage.Text=“”;
}
personImage.SetImageResource(person.ImageId);
返回视图;
}
}
}
我有一个PersonalAdapter类,聊天活动只有listView。所以我通过适配器将列表绑定到listView。我添加了一些人手动查看聊天菜单。如果我将图像添加到drawable文件夹,就不会有问题。但是我如何添加图像来创建新的人物呢。我无法在运行时将图像添加到drawable。当我尝试从外部存储器读取图像时。他们没有资源id,所以person类不接受
{
[Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
public class MainActivity : AppCompatActivity
{
public static List<Person> persons = new List<Person>();
public static Dictionary<int, List<string>> messages = new Dictionary<int, List<string>>();
PersonAdapter adapter;
private static int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 1;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.activity_main);
persons.Add(new Person(0,"Safa", Resource.Drawable.person));
persons.Add(new Person(1,"Melis", Resource.Drawable.person));
persons.Add(new Person(2,"Orkun", Resource.Drawable.person));
messages[0] = new List<string>();
messages[1] = new List<string>();
messages[2] = new List<string>();
messages[0].Add("Naber?");
messages[0].Add("Nasılsın?");
messages[1].Add("Nerdesin?");
messages[1].Add("Saat Kaç?");
messages[2].Add("Buluşalım mı?");
messages[2].Add("Kaçta?");
ListView listView = (ListView)FindViewById(Resource.Id.listView);
adapter = new PersonAdapter(this,persons);
listView.Adapter = adapter;
listView.ItemClick += (object sender, ItemClickEventArgs e) =>
{
Person person = persons[e.Position];
var intent = new Intent(this, typeof(ChatActivity));
intent.PutExtra("name", person.Name);
intent.PutExtra("id", person.Id);
this.StartActivity(intent);
};
FloatingActionButton fab = (FloatingActionButton)FindViewById(Resource.Id.fab);
fab.Click += delegate
{
var intent = new Intent(this, typeof(AddContactActivity));
this.StartActivity(intent);
};
if(Intent.GetStringExtra("person") != null)
{
Person newPerson = JsonConvert.DeserializeObject<Person> (Intent.GetStringExtra("person"));
persons.Add(newPerson);
messages.Add(newPerson.Id, new List<string>());
adapter.NotifyDataSetChanged();
}
}
}
}
{
[活动(Label=“@string/app_name”,Theme=“@style/AppTheme”,MainLauncher=true)]
公共类MainActivity:AppCompativeActivity
{
公共静态列表人员=新列表();
公共静态字典消息=新建字典();
个人适配器;
私有静态int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE=1;
创建时受保护的覆盖无效(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.activity_main);
persons.Add(新的Person(0,“Safa”,Resource.Drawable.Person));
添加(新的人员(1,“Melis”,Resource.Drawable.Person));
添加(新人员(2,“Orkun”,Resource.Drawable.Person));
消息[0]=新列表();
消息[1]=新列表();
消息[2]=新列表();
消息[0]。添加(“Naber?”);
消息[0]。添加(“Nasılsın?”);
消息[1]。添加(“Nerdesin?”);
消息[1]。添加(“Saat Kaç?”);
信息[2]。添加(“Buluşalımı?”;
信息[2]。添加(“Kaçta?”);
ListView ListView=(ListView)FindViewById(Resource.Id.ListView);
适配器=新角色适配器(此,个人);
Adapter=适配器;
listView.ItemClick+=(对象发送者,ItemClickEventArgs e)=>
{
人员=人员[如职位];
var intent=新意图(此,类型为(聊天活动));
意向书(姓名、人名);
意向书(“id”,个人id);
这一点。触觉(意图);
};
FloatingActionButton fab=(FloatingActionButton)FindViewById(Resource.Id.fab);
工厂单击+=委托
{
var intent=新的intent(此,类型为(AddContactActivity));
这一点。触觉(意图);
};
if(Intent.GetStringExtra(“person”)!=null)
{
Person newPerson=JsonConvert.DeserializeObject(Intent.GetStringExtra(“Person”);
人员。添加(新人员);
messages.Add(newPerson.Id,newlist());
adapter.NotifyDataSetChanged();
}
}
}
}
添加联系人活动:
public class AddContactActivity : Activity
{
private ImageView imageView;
private Button loadButton;
private Button addButton;
private EditText nameEditText, surnameEditText;
private int index;
private string filename;
public static int SELECT_IMAGE = 1001;
Drawable drawable;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.activity_addContact);
imageView = FindViewById<ImageView>(Resource.Id.load_image_imageView);
loadButton = FindViewById<Button>(Resource.Id.load_image_button);
addButton = FindViewById<Button>(Resource.Id.add_contact_button);
nameEditText = FindViewById<EditText>(Resource.Id.name_editText);
surnameEditText = FindViewById<EditText>(Resource.Id.surname_editText);
loadButton.Click += loadButtonClicked;
addButton.Click += addContactButtonClicked;
}
private void addContactButtonClicked(object sender, EventArgs e)
{
index = MainActivity.messages.Count;
Console.WriteLine(index);
Person newPerson = new Person(index, nameEditText.Text + " " + surnameEditText.Text, drawable.GetHashCode());
Intent intent = new Intent(this, typeof(MainActivity));
intent.PutExtra("person", JsonConvert.SerializeObject(newPerson));
StartActivity(intent);
}
private void loadButtonClicked(object sender, EventArgs e)
{
if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.ReadExternalStorage) == (int)Permission.Granted)
{
Intent = new Intent();
Intent.SetType("image/*");
Intent.SetAction(Intent.ActionGetContent);
StartActivityForResult(Intent.CreateChooser(Intent, "Select Picture"), SELECT_IMAGE);
}
else
{
ActivityCompat.RequestPermissions(this, new String[] { Manifest.Permission.ReadExternalStorage }, 12);
}
}
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
if ((requestCode == SELECT_IMAGE) && (resultCode == Result.Ok) && (data != null))
{
Android.Net.Uri uri = data.Data;
Bitmap bitmap = MediaStore.Images.Media.GetBitmap(ContentResolver, uri);
imageView.SetImageBitmap(bitmap);
}
else
{
Toast.MakeText(this.ApplicationContext, "You haven't picked an image", ToastLength.Short).Show();
}
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)
{
if (requestCode == 12)
{
if ((grantResults.Length == 1) && (grantResults[0] == Permission.Granted))
{
Intent = new Intent();
Intent.SetType("image/*");
Intent.SetAction(Intent.ActionGetContent);
StartActivityForResult(Intent.CreateChooser(Intent, "Select Picture"), SELECT_IMAGE);
}
}
else
{
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
公共类AddContactActivity:Activity
{
私人影像视图;
专用按钮加载按钮;
私人按钮添加按钮;
私有EditText名称EditText,姓氏EditText;
私有整数索引;
私有字符串文件名;
公共静态int选择_图像=1001;
可拉伸;
创建时受保护的覆盖无效(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.activity\u addContact);
imageView=findviewbyd(Resource.Id.load\u image\u imageView);
loadButton=findviewbyd(Resource.Id.load\u image\u按钮);
addButton=FindViewById(Resource.Id.add\u contact\u按钮);
nameEditText=FindViewById(Resource.Id.name\u editText);
姓氏editText=FindViewById(Resource.Id.姓氏_editText);
loadButton。单击+=单击loadButton;
addButton.单击+=单击AddContactButton;
}
私有void addContactButtonClicked(对象发送方,事件参数e)
{
索引=MainActivity.messages.Count;
控制台写入线(索引);
Person newPerson=新人(索引,nameEditText.Text+“”+姓氏EditText.Text,drawable.GetHashCode());
意向意向=新意向(此,类型为(MainActivity));
intent.PutExtra(“person”,JsonConvert.SerializeObject(newPerson));
星触觉(意向);
}
私有void loadButtonClicked(对象发送方,事件参数e)
{
if(ContextCompat.CheckSelfPermission(this,Manifest.Permission.ReadExternalStorage)==(int)Permission.grated)
{
Intent=新Intent();
Intent.SetType(“image/*”);
public class AddContactActivity : Activity
{
private ImageView imageView;
private Button loadButton;
private Button addButton;
private EditText nameEditText, surnameEditText;
private int index;
private string filename;
public static int SELECT_IMAGE = 1001;
Drawable drawable;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.activity_addContact);
imageView = FindViewById<ImageView>(Resource.Id.load_image_imageView);
loadButton = FindViewById<Button>(Resource.Id.load_image_button);
addButton = FindViewById<Button>(Resource.Id.add_contact_button);
nameEditText = FindViewById<EditText>(Resource.Id.name_editText);
surnameEditText = FindViewById<EditText>(Resource.Id.surname_editText);
loadButton.Click += loadButtonClicked;
addButton.Click += addContactButtonClicked;
}
private void addContactButtonClicked(object sender, EventArgs e)
{
index = MainActivity.messages.Count;
Console.WriteLine(index);
Person newPerson = new Person(index, nameEditText.Text + " " + surnameEditText.Text, drawable.GetHashCode());
Intent intent = new Intent(this, typeof(MainActivity));
intent.PutExtra("person", JsonConvert.SerializeObject(newPerson));
StartActivity(intent);
}
private void loadButtonClicked(object sender, EventArgs e)
{
if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.ReadExternalStorage) == (int)Permission.Granted)
{
Intent = new Intent();
Intent.SetType("image/*");
Intent.SetAction(Intent.ActionGetContent);
StartActivityForResult(Intent.CreateChooser(Intent, "Select Picture"), SELECT_IMAGE);
}
else
{
ActivityCompat.RequestPermissions(this, new String[] { Manifest.Permission.ReadExternalStorage }, 12);
}
}
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
if ((requestCode == SELECT_IMAGE) && (resultCode == Result.Ok) && (data != null))
{
Android.Net.Uri uri = data.Data;
Bitmap bitmap = MediaStore.Images.Media.GetBitmap(ContentResolver, uri);
imageView.SetImageBitmap(bitmap);
}
else
{
Toast.MakeText(this.ApplicationContext, "You haven't picked an image", ToastLength.Short).Show();
}
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)
{
if (requestCode == 12)
{
if ((grantResults.Length == 1) && (grantResults[0] == Permission.Granted))
{
Intent = new Intent();
Intent.SetType("image/*");
Intent.SetAction(Intent.ActionGetContent);
StartActivityForResult(Intent.CreateChooser(Intent, "Select Picture"), SELECT_IMAGE);
}
}
else
{
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
public class MyUtils
{
public static string ConvertBitMapToString(Bitmap bitmap)
{
byte[] bitmapData;
using (MemoryStream stream = new MemoryStream())
{
bitmap.Compress(Android.Graphics.Bitmap.CompressFormat.Jpeg, 50, stream);
bitmapData = stream.ToArray();
}
string ImageBase64 = Convert.ToBase64String(bitmapData);
return ImageBase64;
}
public static Bitmap ConvertStringToBitmap(string mystr)
{
byte[] decodedString = Base64.Decode(mystr, Base64.Default);
Bitmap decodedByte = BitmapFactory.DecodeByteArray(decodedString, 0, decodedString.Length);
return decodedByte;
}
}
public string ImageId // property
{
get { return imageId; } // get method
set { imageId = value; } // set method
}