layout_weight 用于给一个线性布局中的诸多视图的重要度赋值。

本文详细解析了视图的layout_weight属性如何影响布局分配。通过实例说明不同权重值如何决定视图在父容器中的空间占比。
所有的视图都有一个layout_weight值,默认为零,意思是需要显示多大的视图就占据多大的屏幕空 间。若赋一个高于零的值,则将父视图中的可用空间分割,分割大小具体取决于每一个视图的layout_weight值以及该值在当前屏幕布局的整体 layout_weight值和在其它视图屏幕布局的layout_weight值中所占的比率而定。

举个例子:比如说我们在 水平方向上有一个文本标签和两个文本编辑元素。该文本标签并无指定layout_weight值,所以它将占据需要提供的最少空间。

如果两个文本编辑元素每一个的layout_weight值都设置为1,则两者平分在父视图布局剩余的宽度(因为我们声明这两者的重要度相等)。
如果两个文本编辑元素其中第一个的layout_weight值设置为1,而第二个的设置为2,则剩余空间的三分之二分给第一个,三分之一分给第二个(数值越小,重要度越高)。
那么现在MapFragment的代码如下:package com.example.bus.ui.map; import android.Manifest; import android.content.pm.PackageManager; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import com.amap.api.maps.AMap; import com.amap.api.maps.model.LatLng; import com.example.bus.databinding.FragmentMapBinding; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.MapView; import com.google.android.gms.maps.UiSettings; public class MapFragment extends Fragment { private FragmentMapBinding binding; private MapView mapView; // 高德地图视图 private AMap aMap; // 地图控制器 private static final int LOCATION_PERMISSION_REQUEST_CODE = 1002; @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // 初始化 ViewModel 和 ViewBinding MapViewModel mapViewModel = new ViewModelProvider(this).get(MapViewModel.class); binding = FragmentMapBinding.inflate(inflater, container, false); View root = binding.getRoot(); //绑定 MapView mapView = root.findViewById(R.id.map_view); mapView.onCreate(savedInstanceState); // 必须调用生命周期方法 // 初始化地图 initMap(); // 观察 LiveData final TextView textView = binding.textMap; mapViewModel.getText().observe(getViewLifecycleOwner(), textView::setText); return root; } /** * 初始化地图 */ private void initMap() { if (aMap == null) { aMap = mapView.getMap(); UiSettings uiSettings = aMap.getUiSettings(); uiSettings.setZoomControlsEnabled(true); // 显示缩放按钮 uiSettings.setCompassEnabled(true); // 显示指南针 uiSettings.setMyLocationButtonEnabled(false); // 我们自己控制定位行为 } } @Override public void onResume() { super.onResume(); //每次恢复可见时都检查权限状态 mapView.onResume(); checkLocationPermissionAndAct(); } @Override public void onPause() { super.onPause(); mapView.onPause(); } @Override public void onDestroyView() { super.onDestroyView(); if (mapView != null) { mapView.onDestroy(); } binding = null; } @Override public void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); mapView.onSaveInstanceState(outState); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == LOCATION_PERMISSION_REQUEST_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(requireContext(), "已获得精确定位权限", Toast.LENGTH_SHORT).show(); onLocationPermissionGranted(); } else { Toast.makeText(requireContext(), "无法获取位置信息,请手动开启权限", Toast.LENGTH_LONG).show(); binding.textMap.setText("❌ 定位权限被拒绝"); } } } /** * 权限通过后的回调:开启定位并移动到当前城市 */ private void onLocationPermissionGranted() { if (aMap != null) { // 启用定位层 if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { aMap.setMyLocationEnabled(true); // 可选:移动到某个默认位置(如北京) LatLng beijing = new LatLng(39.909186, 116.397411); aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(beijing, 12f)); binding.textMap.setText("📍 地图已加载,正在准备定位..."); } } } /** * 统一入口:检查定位权限并做出相应行为 */ private void checkLocationPermissionAndAct() { if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { onLocationPermissionGranted(); } else if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { //可选:支持模糊定位模式 onLocationPermissionGranted(); binding.textMap.setText("📶 使用大致位置中..."); } else { requestLocationPermission(); } } /** * 主动请求定位权限 */ private void requestLocationPermission() { if (shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_FINE_LOCATION)) { Toast.makeText(requireContext(), "需要定位权限以显示附近公交站", Toast.LENGTH_LONG).show(); } requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_PERMISSION_REQUEST_CODE); } } fragment_map.xml的代码如下:<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".ui.map.MapFragment"> <!-- 🗺️ 地图视图:占据顶部大部分区域 --> <com.amap.api.maps.MapView android:id="@+id/map_view" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toTopOf="@id/map_input1" app:layout_constraintVertical_weight="7" /> <TextView android:id="@+id/text_map" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginEnd="8dp" android:textAlignment="center" android:textSize="11sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.85" /> <!-- 起点输入框 --> <EditText android:id="@+id/map_input1" android:layout_width="0dp" android:layout_height="wrap_content" android:hint="请输入起点" android:minHeight="48dp" android:textSize="16sp" android:layout_marginLeft="10dp" android:layout_marginRight="110dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.1" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0" /> <!-- 终点输入框 --> <EditText android:id="@+id/map_input2" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginRight="110dp" android:hint="请输入终点" android:minHeight="48dp" android:textSize="16sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.008" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.07" /> <Button android:id="@+id/map_search" android:layout_width="wrap_content" android:layout_height="80dp" android:text="搜索" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.95" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.01" /> </androidx.constraintlayout.widget.ConstraintLayout>现在出现报错:错误: 程序包R不存在、错误: 找不到符号 符号: 方法 getMap() 位置: 类型为MapView的变量 mapView、错误: 不兼容的类型: com.amap.api.maps.UiSettings无法转换为com.google.android.gms.maps.UiSettings、错误: 不兼容的类型: com.amap.api.maps.model.LatLng无法转换为com.google.android.gms.maps.model.LatLng
10-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值