Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在运行时将图像从gallery绑定到imageView?_Android_Xamarin_Xamarin.android - Fatal编程技术网

Android 如何在运行时将图像从gallery绑定到imageView?

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

我有一个关于做whatsapp克隆的家庭作业。但我有个问题。我有一个添加联系人屏幕。用户从gallery中选择图像并输入其名称。当他们单击添加按钮时,列表项将添加到聊天活动中。截图如下。我有一个person类,比如:

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
    }