ViewGroup.setSelected 改变UI的状态

本文将介绍在并列的多个ViewGroup中,如何通过设置状态来区分并选择特定的ViewGroup,避免了逐个设置组件颜色的繁琐操作。通过Java代码实现切换不同ViewGroup的状态,提升用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有多个ViewGroup并列的情景中,我们需要选出一个,改变其背景色,区别于其它未选状态。


如图所示:


xml布局文件:

<LinearLayout
    android:id="@+id/vw_user_tab_video"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_gravity="center"
    android:layout_marginBottom="3dp"
    android:layout_weight="1">
    
    <TextView
        android:id="@+id/vw_user_tab_video_num"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:textColor="@color/user_tab_text_color"
        android:textSize="15sp"
        android:text="0"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:textColor="@color/user_tab_text_color"
        android:textSize="15sp"
        android:text="@string/user_tab_video"/>
    
</LinearLayout>


这个时候,通常有两种方案。


方案1:通过单独设置组件中每一个文子的颜色,来区分开。但是如果ViewGroup包含多个子控件,工作量太大。


因此,要采用其它方案。


方案2:通过设置RelativeLayout/LinearLayout的selected状态来区分UI。

java代码:

/**
 * 选中指定tab
 * @param i
 */
public void setSelectTab(int i){
    mVideoTab.setSelected(false);
    mZanTab.setSelected(false);
    mFollowTab.setSelected(false);
    mFansTab.setSelected(false);
    switch (i){
        case TAB_VIDEO:
            mVideoTab.setSelected(true);
            break;
        case TAB_ZAN:
            mZanTab.setSelected(true);
            break;
        case TAB_FOLLOW:
            mFollowTab.setSelected(true);
            break;
        case TAB_FANS:
            mFansTab.setSelected(true);
            break;
    }
}








package com.example.music_player.fragment; import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.example.music_player.Item; import com.example.music_player.ItemAdapter; import com.example.music_player.R; import java.util.ArrayList; import java.util.List; /** * A simple {@link Fragment} subclass. * Use the {@link SearchFragment#newInstance} factory method to * create an instance of this fragment. */ public class SearchFragment extends Fragment { private RecyclerView recyclerView; private ItemAdapter adapter; private List<Item> filteredItems = new ArrayList<>(); private String currentCategory = "meditation"; // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER private static final String ARG_PARAM1 = "param1"; private static final String ARG_PARAM2 = "param2"; // TODO: Rename and change types of parameters private String mParam1; private String mParam2; public SearchFragment() { // Required empty public constructor } /** * Use this factory method to create a new instance of * this fragment using the provided parameters. * * @param param1 Parameter 1. * @param param2 Parameter 2. * @return A new instance of fragment SearchFragment. */ // TODO: Rename and change types and number of parameters public static SearchFragment newInstance(String param1, String param2) { SearchFragment fragment = new SearchFragment(); Bundle args = new Bundle(); args.putString(ARG_PARAM1, param1); args.putString(ARG_PARAM2, param2); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { mParam1 = getArguments().getString(ARG_PARAM1); mParam2 = getArguments().getString(ARG_PARAM2); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_search, container, false); // recyclerView = view.findViewById(R.id.recycler_items); // initDummyData(); // //initViews(view); // // // 检查是否为null // if (recyclerView != null) { // initViews(view); // 将初始化逻辑移到这里 // } else { // Log.e(TAG, "RecyclerView is null! Check your layout file."); // } return view; } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // 1. 初始化RecyclerView recyclerView = view.findViewById(R.id.recycler_items); if (recyclerView == null) { Log.e("SearchFragment", "RecyclerView is null! Check layout file."); return; } // 2. 创建布局管理器 recyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); // 3. 创建模拟数据 initDummyData(); // 4. 初始化适配器并设置 adapter = new ItemAdapter(requireContext(), filteredItems); recyclerView.setAdapter(adapter); // 5. 可选:添加分割线 // recyclerView.addItemDecoration(new DividerItemDecoration( // getContext(), DividerItemDecoration.VERTICAL)); // 设置分类标签点击事件 setupCategoryTabs(view); } private void initDummyData() { filteredItems.clear(); filteredItems.add(new Item(R.drawable.pic1, "水滴", 256, "冥想")); filteredItems.add(new Item(R.drawable.pic1, "水滴", 256, "冥想")); filteredItems.add(new Item(R.drawable.pic1, "水滴", 256, "冥想")); filteredItems.add(new Item(R.drawable.pic1, "水滴", 256, "冥想")); } // // private void initViews(View view) { // // 初始化RecyclerView // //recyclerView = view.findViewById(R.id.recycler_items); // recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); // adapter = new ItemAdapter(new ArrayList<>(filteredItems)); // recyclerView.setAdapter(adapter); // // // 设置类别点击监听 // setupCategoryClicks(view); // } // private void setupCategoryClicks(View rootView) { // int[] categoryIds = { // R.id.category_meditation, // R.id.category_white_noise // }; // // for (int id : categoryIds) { // TextView categoryView = rootView.findViewById(id); // categoryView.setOnClickListener(v -> { // // 更新选中状态 // updateCategorySelection(v); // // // 根据tag获取类别 // String category = v.getTag().toString(); // filterItems(category); // }); // } // } private void setupCategoryTabs(View view) { TextView meditation = view.findViewById(R.id.category_meditation); TextView whiteNoise = view.findViewById(R.id.category_white_noise); // 设置初始选中状态 meditation.setSelected(true); meditation.setOnClickListener(v -> { meditation.setSelected(true); whiteNoise.setSelected(false); filterItems("冥想"); }); whiteNoise.setOnClickListener(v -> { meditation.setSelected(false); whiteNoise.setSelected(true); filterItems("白噪音"); }); } // private void updateCategorySelection(View selectedView) { // // 重置所有类别状态 // ViewGroup container = (ViewGroup) selectedView.getParent(); // for (int i = 0; i < container.getChildCount(); i++) { // View child = container.getChildAt(i); // child.setSelected(child == selectedView); // } // } private void filterItems(String category) { List<Item> filtered = new ArrayList<>(); for (Item item : filteredItems) { if (category.equals(item.getCategory())) { // filteredItems.add(item); // } } adapter = new ItemAdapter(getContext(), filtered); recyclerView.setAdapter(adapter); } // private void filterItems(String category) { // filteredItems.clear(); // for (Item item : filteredItems) { // if (category.equals(item.getCategory())) { // filteredItems.add(item); // } // } // adapter.updateList(filteredItems); // } } }
最新发布
06-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值