Xamarin Android:单击时更改 GridView 项目的背景颜色

问题描述 投票:0回答:3

我正在搜索如何在单击时更改所单击的 gridview 项目的背景颜色,然后返回正常颜色

我希望当我单击时,我的 gridview 项目的背景颜色是橙色,然后不久之后,背景再次变为白色。

这是我发现的,但“设备”未知。

e.View.SetBackgroundColor(Color.White);
Device.StartTimer(TimeSpan.FromSeconds(0.25), () =>
{
    e.View.SetBackgroundColor(Color.Orange);
    return false;
});

我试过这个:

  1. 通过在值中创建colors.xml来定义颜色

    #972234 #000000
  2. 在drawable中创建bg_key.xml

  3. 将 android:listSelector 和 listSelector 设置为 GridView

       android:listSelector="@drawable/bg_key"
       android:background="@color/default_color"
    
       />
    

它在我的侧面菜单上工作,但在我的网格视图上不起作用...我的网格视图由 ImageView 和 TextView 组成,这是问题吗?

另外,我应该更改什么(对于我的侧面菜单)来更改字体颜色而不是背景颜色?


这是我的代码:

Main.axml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#EBEAEF">
<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?attr/actionBarSize"
    android:paddingLeft="5dp"
    android:background="#282059"
    android:title="test"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Dark" />
<android.support.v4.widget.DrawerLayout
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">
<!-- The Main Content View -->
    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
        <ImageView
            android:id="@+id/logoBackgroud"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:src="@drawable/icon_background" />
        <GridView
            android:id="@+id/grid_view_image_text"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:columnWidth="350dp"
            android:layout_margin="10dp"
            android:gravity="center"
            android:numColumns="auto_fit" />
    </RelativeLayout>

gridview.axml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#EBEAEF">
<RelativeLayout
    android:layout_height="90dp"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_margin="25dp"
    android:listSelector="@drawable/bg_key"
    android:background="#F4F4F6">
<!-- Letter yellow color = #FAB322  -->
    <TextView
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:layout_width="95dp"
        android:layout_height="fill_parent"
        android:textSize="66sp"
        android:textColor="#0071CF"
        android:background="@color/white"
        android:layout_centerVertical="true"
        android:layout_gravity="left"
        android:gravity="center_vertical|center_horizontal"
        android:text="A"
        android:paddingBottom="5dp"
        android:id="@+id/textViewLetter" />
    <TextView
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:paddingLeft="15dp"
        android:layout_toRightOf="@+id/textViewLetter"
        android:layout_centerVertical="true"
        android:layout_marginRight="35dp"
        android:textSize="22sp"
        android:gravity="center_vertical"
        android:background="#F4F4F6"
        android:textColor="#262057"
        android:textStyle="bold"
        android:listSelector="@drawable/bg_key"
        android:id="@+id/textViewFileName" />
    <ImageView
        android:layout_width="35dp"
        android:layout_height="wrap_content"
        android:paddingTop="5dp"
        android:layout_alignParentRight="true"
        android:id="@+id/imageViewIcon" />
</RelativeLayout>
</LinearLayout>
c# android gridview xamarin colors
3个回答
0
投票

您不能使用

Device
-Class,因为它仅在 Xamarin.Forms 中可用,而不是本机 Xamarin。

但是您可以使用

System.Timers.Timer
类在一段时间后将颜色改回来:

var t = new System.Timers.Timer();
t.Interval = 250;   // In miliseconds
t.Elapsed += (sender, args) =>
{
    // Change color back on the UI-Thread
    RunOnUiThread(() =>
    {
        e.View.SetBackgroundColor(Color.Orange);        
    });

};
t.Start();

重要提示:

Elapsed
事件不在 UI 线程上调用。因此,要更改 UI 上的某些内容(就像背景颜色一样),您需要在 UI 线程上执行此操作。


0
投票

Device.StartTimer
在 Xamarin.Forms 中用于使用设备时钟功能启动循环计时器。它在本机中不可用。

我更喜欢你可以制作自定义样式。


试试这个:

1) 通过在

colors.xml
 中创建 
values

来定义颜色
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <color name="pressed_color">#972234</color>
  <color name="default_color">#000000</color>
</resources>

2) 在

bg_key.xml
中创建
drawable

<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item
      android:state_selected="true"
      android:drawable="@color/pressed_color"/>
  <item
      android:state_pressed="true"
      android:drawable="@color/pressed_color"/>
  <item
      android:drawable="@color/default_color" />
</selector>

3) 将

android:listSelector
和 listSelector 设置为 GridView

<GridView xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@+id/gridview"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:columnWidth="90dp"
          android:numColumns="auto_fit"
          android:verticalSpacing="10dp"
          android:horizontalSpacing="10dp"
          android:stretchMode="columnWidth"
          android:gravity="center" 

          android:listSelector="@drawable/bg_key"
          android:background="@color/default_color"

          />

0
投票

要在单击 GridView 项目时更改其背景颜色,可以使用 GridView 的适配器,并根据项目是否被单击在 GetView 方法中修改项目视图的背景。

这是一个例子:

创建自定义适配器:此适配器将管理 GridView 中的项目并处理单击事件以更改背景颜色。

处理项目点击:在GridView中,您可以设置项目点击监听器来更新被点击项目的背景。

grid_item.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp">

<TextView
    android:id="@+id/item_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:textSize="18sp"
    android:textColor="#000000" />
</FrameLayout>

自定义GridAdapter.cs

public class CustomGridAdapter : BaseAdapter<string>
{
private Context context;
private List<string> items;
private int selectedItemPosition = -1;
public CustomGridAdapter(Context context, List<string> items)
{
    this.context = context;
    this.items = items;
}

public override string this[int position] => items[position];

public override int Count => items.Count;

public override long GetItemId(int position) => position;

public override View GetView(int position, View convertView, ViewGroup parent)
{
    View view = convertView ?? LayoutInflater.From(context).Inflate(Resource.Layout.grid_item, parent, false);
    TextView textView = view.FindViewById<TextView>(Resource.Id.item_text);

    textView.Text = items[position];

    // Change background color based on the selected item
    if (position == selectedItemPosition)
    {
        view.SetBackgroundColor(Android.Graphics.Color.LightBlue); // Change to desired color
    }
    else
    {
        view.SetBackgroundColor(Android.Graphics.Color.Transparent); // Default color
    }

    return view;
}

// Method to update selected position and refresh the view
public void SetSelectedItem(int position)
{
    selectedItemPosition = position;
    NotifyDataSetChanged();
}}

MainActivity.cs

public class MainActivity : Activity
{
GridView gridView;
CustomGridAdapter adapter;
List<string> items;

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    SetContentView(Resource.Layout.activity_main);

    gridView = FindViewById<GridView>(Resource.Id.gridview);
    items = new List<string> { "Item 1", "Item 2", "Item 3", "Item 4" };

    adapter = new CustomGridAdapter(this, items);
    gridView.Adapter = adapter;

    gridView.ItemClick += GridView_ItemClick;
}

private void GridView_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
{
    // Update the selected item in the adapter
    adapter.SetSelectedItem(e.Position);
}}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">

<GridView
    android:id="@+id/gridview"
    android:numColumns="2"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

在 GetView 方法中,背景颜色根据是否选择项目而变化。

这应该会在单击 GridView 项目时更改其背景颜色。

© www.soinside.com 2019 - 2024. All rights reserved.