这是我在RecycleView适配器类中使用的代码。我不知道这是使用视图绑定的正确方法还是不正确。如果您有更好的解决方案,请回答我。谢谢你。
@Override
public CategoryAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.common_circle_image, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull CategoryAdapter.MyViewHolder holder, final int position) {
holder.binding.img.setBackgroundResource(addAdapterData.get(position).getItemUrl());
holder.binding.txt.setText(addAdapterData.get(position).getItemName());
}
@Override
public int getItemCount() {
return addAdapterData.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
CommonCircleImageBinding binding;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
binding = CommonCircleImageBinding.bind(itemView);
binding.cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
commonItemClick.onItemClick(getAdapterPosition(),"");
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
另外,我想知道在同一个班级使用R.layout.layout_name和使用是否正确ViewBinding。
我一直在使用findViewById然后使用ButterKnife 来绑定视图。最近,我看到了这篇文章:https : //proandroiddev.com/new-in-android-viewbindings-the-difference-from-databinding-library-bef5945baf5e,我不太确定如何使用它。
我尝试这样做,但它似乎在 Android Studio 3.4.2 中不起作用
val binding = MainActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
然后使用这些值,例如:
binding.button....
binding.textView....
我使用 Android Studio 3.6-RC1 和构建工具版本 3.6.0-rc01 并遇到了 ViewBinding 功能的问题:
我有带有以下标记的 activity_test.xml 文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
android:id="@+id/view_merged"
layout="@layout/merge_view" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
和 merge_view.xml 带有以下标记:
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Merge view" />
</merge>
Run Code Online (Sandbox Code Playgroud)
活动代码如下所示:
class TestActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityTestBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.viewMerged.label.text = "New text"
}
}
Run Code Online (Sandbox Code Playgroud)
问题是当我尝试从合并布局访问 TextView 时,应用程序抛出异常并显示消息 java.lang.NullPointerException: Missing required view with ID: viewMerged.
生成的绑定类如下所示:
public final class ActivityTestBinding implements ViewBinding {
@NonNull
private final …Run Code Online (Sandbox Code Playgroud) 我很难理解android使用的运行时权限方法.对于那些正在阅读本文的人,我不是在这里问"如何调用运行时权限"..如果尚未授予权限对话框,我可以显示权限对话框,甚至可以在片段中获取onRequestPermissionsResult().
用这个代码
if (ContextCompat.checkSelfPermission(mActivity, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
FragmentCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, RQ_GET_LOCATION);
Log.e("permission", "asking permission");
return;
}
Log.e("permission", "permission already granted");
accessLocation();
Run Code Online (Sandbox Code Playgroud)
获得结果 onRequestPermissionsResult
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
{
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case RQ_GET_LOCATION:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.e("permission", "onRequestPermissionsResult : permission granted, access location here");
accessLocation();
}
else {
Log.e("permission", "onRequestPermissionsResult : permission denied");
}
break;
}
}
Run Code Online (Sandbox Code Playgroud)
里面的代码accessLocation()是
private void accessLocation()
{
Log.e("permission", "accessing location permission"); …Run Code Online (Sandbox Code Playgroud) 在具有约束布局的布局定义中使用的以下XML指令的java代码的转换是什么?
app:layout_constraintBottom_toBottomOf="@+id/Button1"
app:layout_constraintTop_toTopOf="@+id/Button1"
app:layout_constraintLeft_toLeftOf="@+id/Button2"
app:layout_constraintRight_toRightOf="Button2"
Run Code Online (Sandbox Code Playgroud) 从onCreate()我的活动,
我试图通过以下代码启动服务:
Intent intent = new Intent();
intent.setClassName(SERVICE_PKG_NAME, SERVICE_NAME);
context.startService(intent); //context = MainActivity.this
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下异常:
java.lang.IllegalStateException:不允许启动服务Intent(service-name):app在后台
知道这可能是什么原因吗?现在坚持几个小时.
我有这个页面,我已经使用 MVVM 和分页进行了设置RecyclerView,并使用Pull 刷新。单击此中的某些项目RecyclerView将导航到另一个片段。
我的问题是每当我第一次加载页面并完全向下滚动时。拉动刷新也可以。
但是当我导航到另一个片段并返回时,一直滚动到顶部,滑动以刷新:RecyclerView将跳转到页面中间(就在我单击以导航到另一个片段的项目上)
我的片段
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val adapter = GroupAdapter<ViewHolder>().apply { add(mainSection) }
val gridLayoutManager = GridLayoutManager(activity, adapter.spanCount)
gridLayoutManager.spanSizeLookup = adapter.spanSizeLookup
with(recyclerView) {
layoutManager = gridLayoutManager
setHasFixedSize(true)
addOnScrollListener(PaginationScrollListener {
viewModel.onEndOfList()
})
}
recyclerView.adapter = adapter
pullToRefresh.apply {
setProgressBackgroundColorSchemeColor(
ContextCompat.getColor(context, R.color.window_level_2)
)
setColorSchemeColors(ContextCompat.getColor(context, R.color.brand_primary))
setOnRefreshListener { viewModel.onRefresh() }
}
}
Run Code Online (Sandbox Code Playgroud)
我的视图模型
fun onRefresh() {
page = 0
widgetItems.clear()
_widgetListObservable.postValue(widgetItems)
finishedLoading = false
isFirstFetch = true …Run Code Online (Sandbox Code Playgroud) 我已经开始在我的片段和活动中使用视图绑定。片段的推荐模式是中的null绑定字段onDestroyView()。我还在自定义视图中使用视图绑定。我是否还需要清除该视图绑定字段?我想是这样,但没有onDestroyed()视图功能。有一个View.onDetachedFromWindow()函数,但我不确定这是否是null绑定字段的合适位置。
这是一个合理的担忧吗?如果是,我该如何实现呢?
RecyclerView 文档提到了一个公共方法 - getBindingAdapterPosition。 https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView.ViewHolder#getBindingAdapterPosition()
但我似乎无法找到它。
我错过了什么?
我很难弄清楚如何在请求的情况下连接我的Repository和ViewModel的实时数据@GET并在片段中观察它们。
当请求类型是@POST因为我可以Transformation.switchMap在主体上使用时,我没有这个问题,并且每当主体更改存储库的函数被调用并向响应实时数据发出值时,就像这样
val matchSetsDetail: LiveData<Resource<MatchDetailBean>> = Transformations.switchMap(matchIdLiveData) { matchId ->
val body = MatchSetRequest(matchId)
repository.getMatchSet(body)
}
Run Code Online (Sandbox Code Playgroud)
但是在@GET请求的情况下,我的视图提供了几个查询参数
我在存储库类中有这个改造 API 调用,代码看起来像这样
class Repository {
fun checkInCheckOutUser(apiKey: String, userId: Int, status: String, latitude: Double, longitude: Double, checkedOn: Long): LiveData<Resource<BaseResponse>> = liveData {
emit(Resource.Loading())
try {
val response: Response<BaseResponse> = ApiClient.coachApi.checkInCheckOutUser(apiKey, userId, status, latitude, longitude, checkedOn)
if (response.isSuccessful && response.body() != null) {
if (response.body()!!.isValidKey && response.body()!!.success) {
emit(Resource.Success(response.body()!!))
} else …Run Code Online (Sandbox Code Playgroud) android kotlin android-livedata android-architecture-components kotlin-coroutines
我现在有一个要在其中显示地图的Fragment,但现在我这样做了,但是当我调用一个函数时,它抛出了我无法到达的错误。
public class HomeFragment extends Fragment {
private static final String TAG = "HomeFragment";
private static final String FINE_LOCATION = Manifest.permission.ACCESS_FINE_LOCATION;
private static final String COARSE_LOCATION = Manifest.permission.ACCESS_COARSE_LOCATION;
//vars
private Boolean mLocationPermissionsGranted = false;
private static final int LOCATION_PERMISSION_REQUEST_CODE = 1234;
private GoogleMap mMap;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.layout_home, container, false);
getLocationPermision();
}
private void initMap() {
SupportMapFragment mapFragment = (SupportMapFragment) getFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap …Run Code Online (Sandbox Code Playgroud)