{"id":21803015,"url":"https://github.com/litongjava/android-view-inject","last_synced_at":"2026-05-04T16:31:50.145Z","repository":{"id":57726232,"uuid":"464094426","full_name":"litongjava/android-view-inject","owner":"litongjava","description":"适用与嵌入式设备的控件注入框架","archived":false,"fork":false,"pushed_at":"2022-04-26T05:20:06.000Z","size":20,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-28T08:32:00.949Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/litongjava.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-02-27T09:42:45.000Z","updated_at":"2024-07-26T05:22:12.000Z","dependencies_parsed_at":"2022-09-17T14:31:34.087Z","dependency_job_id":null,"html_url":"https://github.com/litongjava/android-view-inject","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/litongjava%2Fandroid-view-inject","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/litongjava%2Fandroid-view-inject/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/litongjava%2Fandroid-view-inject/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/litongjava%2Fandroid-view-inject/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/litongjava","download_url":"https://codeload.github.com/litongjava/android-view-inject/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244752362,"owners_count":20504256,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-27T11:37:12.808Z","updated_at":"2026-05-04T16:31:45.120Z","avatar_url":"https://github.com/litongjava.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# android-view-inject\n## 简介\n适用与嵌入式设备的控件注入框架\n## 概述\n传统的项目中，为了从XML文件找到各个控件，需要使用方法findViewById,太多的findViewId,使我们的代码变得繁琐，\n获取，强转，千篇一律的重复着某种机制，其实内心也是蛮崩溃的。\n当然了，为了解决不必要的findViewById，有很多出色的第三方，如ButterKnife，AndroidAnotations，还有XUtils,等等，这些第三方不可否认，\n是特别的优秀，功能也是非常的强大，使用起来也是非常的简单，但是，也有一定的负面影响，\n显而可见，这些第三方，不仅仅有注解功能，还有联网，请求数据库等等其它很多功能，\n而我们只需要一个注解功能，这不等于，我需要一个苹果，你一下给了我一车水果，无形中增加了内存的容量\n其实说的通俗点就是，第三方很多冗余的代码，会占去我们的内存，基于这样的一个原因，不就是一个注解功能吗，我们何不自己实现呢?\n## 主要功能\n### 参考工程\nAndroidViewInjectTest\n### 安装工程到本地\n这是一个maven工程,使用maven将工程安装到本地\n### 添加依赖\n在build.gradle中添加mavenLocal()\n```\nbuildscript {\n\n  repositories {\n    mavenLocal()\n    google()\n    jcenter()\n  }\n  dependencies {\n    classpath 'com.android.tools.build:gradle:3.1.3'\n\n    // NOTE: Do not place your application dependencies here; they belong\n    // in the individual module build.gradle files\n  }\n}\n\nallprojects {\n  repositories {\n    mavenLocal()\n    google()\n    jcenter()\n  }\n}\n\ntask clean(type: Delete) {\n  delete rootProject.buildDir\n}\n\n```\n添加构件\n```\n  implementation 'com.litongjava:android-view-inject:1.0.1'\n```\n### 整合Activity\n* @FindViewByIdLayout 查找布局文件并注入到当前Activity,用于替换setContentView\n* @FindViewById 查看控件id,注入到成员变量\n* @OnClick 添加单击事件\n\n\n测试代码\n```\npackage com.litongjava.android_view_inject_test;\n\nimport android.os.Bundle;\nimport android.support.v7.app.AppCompatActivity;\nimport android.view.View;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport com.litongjava.android.view.inject.annotation.FindViewById;\nimport com.litongjava.android.view.inject.annotation.FindViewByIdLayout;\nimport com.litongjava.android.view.inject.annotation.OnClick;\nimport com.litongjava.android.view.inject.utils.ViewInjectUtils;\n\n@FindViewByIdLayout(R.layout.activity_main)\npublic class MainActivity extends AppCompatActivity {\n\n  @FindViewById(R.id.tv)\n  private TextView mText;\n\n  @Override\n  protected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n    //setContentView(R.layout.activity_main);\n    ViewInjectUtils.injectActivity(this, this);\n    mText.setText(\"Annotation\");\n  }\n\n  @OnClick(R.id.tv)\n  public void onClick(View view) {\n    Toast.makeText(this, \"on click\", Toast.LENGTH_LONG).show();\n  }\n}\n```\n\n### Fragment\n布局文件\nfragment_async.xml\n```\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\n\u003cLinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"match_parent\"\n  android:orientation=\"vertical\"\u003e\n\n  \u003cButton\n    android:id=\"@+id/btn1\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"按钮1\"/\u003e\n\u003c/LinearLayout\u003e\n```\n测试类如下\n```\npackage com.litongjava.android_view_inject_test.fragment;\n\nimport android.os.Bundle;\nimport android.support.annotation.NonNull;\nimport android.support.annotation.Nullable;\nimport android.support.v4.app.Fragment;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.Button;\nimport android.widget.Toast;\n\nimport com.litongjava.android.view.inject.annotation.FindViewById;\nimport com.litongjava.android.view.inject.annotation.OnClick;\nimport com.litongjava.android.view.inject.utils.ViewInjectUtils;\nimport com.litongjava.android_view_inject_test.R;\n\n\n\npublic class AsyncTaskFragment extends Fragment{\n\n  @FindViewById(R.id.btn1)\n  private Button button1;\n\n\n  public static Fragment newInstance() {\n    return new AsyncTaskFragment();\n  }\n\n\n  @Nullable\n  @Override\n  public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {\n    View view = inflater.inflate(R.layout.fragment_async, container, false);\n    ViewInjectUtils.injectViewAndOnClick(view,this);\n    return view;\n  }\n\n\n  @OnClick(R.id.btn1)\n  public void button1OnClick(){\n    Toast.makeText(this.getActivity(),\"button 1 click\",Toast.LENGTH_LONG).show();\n  }\n}\n\n```\n### RecyclerView\nfragment_photo_gallery.xml\n```\n\u003candroid.support.v7.widget.RecyclerView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:id=\"@+id/fragment_photo_gallery_recycler_view\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"match_parent\" /\u003e\n```\n使用RecyclerView代码\n```\npackage com.litongjava.android_view_inject_test.fragment;\n\nimport android.os.Bundle;\nimport android.support.annotation.NonNull;\nimport android.support.annotation.Nullable;\nimport android.support.v4.app.Fragment;\nimport android.support.v7.widget.GridLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.litongjava.android.view.inject.annotation.FindViewById;\nimport com.litongjava.android.view.inject.utils.ViewInjectUtils;\nimport com.litongjava.android_view_inject_test.R;\n\n\npublic class PhotoGalleryFragment extends Fragment {\n  @FindViewById(R.id.fragment_photo_gallery_recycler_view)\n  private RecyclerView mPhotoRecyclerView;\n\n  public static Fragment newInstance() {\n    return new PhotoGalleryFragment();\n  }\n\n  @Nullable\n  @Override\n  public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {\n    View view = inflater.inflate(R.layout.fragment_photo_gallery, container, false);\n    //mPhotoRecyclerView = (RecyclerView)view.findViewById(R.id.fragment_container);\n    ViewInjectUtils.injectView(view, this);\n    mPhotoRecyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 3));\n    return view;\n  }\n}\n```\n### ViewHolder\n在ViewHolder 中使用ViewUtils.inject\n```\nprivate class CrimeHolder extends RecyclerView.ViewHolder {\n\n  @FindViewById(R.id.list_item_crime_date_text_view)\n  private TextView mTittleTextView;\n\n\n  public CrimeHolder(View itemView) {\n    super(itemView);\n    ViewInjectUtils.injectView(itemView,this);\n  }\n}\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flitongjava%2Fandroid-view-inject","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flitongjava%2Fandroid-view-inject","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flitongjava%2Fandroid-view-inject/lists"}