いくつかのコードエクスペリエンスの共有

いくつかのコードエクスペリエンスの共有

コードの書き方

1. kotlin を使用してイベント コールバックを作成する場合、次のように Lambda 式を使用して簡素化できます。
view.bt_apply.setOnClickListener { viewModel.onApplyClick() }

2. プロジェクトの依存関係を出力します
/gradlew: プロジェクト名: 依存関係 > 保存するファイル.txt
例: ./gradlew:biz-aer:dependency > 1depen.txt

3. fastJson を使用して kotlin オブジェクトを解析します。失敗しやすいため、Java オブジェクトに変換することをお勧めします

4. ソフトウェア バージョンの区別
● アルファ バージョン: 内部テスト バージョン。α はギリシャ文字の最初の文字で、最も古いバージョンを意味します。一般ユーザーはこのバージョンをダウンロードしないでください。このバージョンには多くのバグが含まれており、機能が完全ではありません。主に開発者とテスターがテストしてバグを見つけるためのものです。
● ベータ: パブリックベータ版。β はギリシャ文字の 2 番目の文字です。名前が示すように、このバージョンは、主に「horde」ユーザーと忠実なユーザーのテスト用に、α バージョンより後にリリースされました。このバージョンにはまだ多くのバグがありますが、それよりも多くのバグがあります。アルファ版よりも安定しています。ソフトウェアのこの段階バージョンでは、引き続き新機能が追加されます。オーディオファンの方は、このバージョンをダウンロードできます。
● rc バージョン: Release Candidate (候補バージョン)。このバージョンはベータ版よりも一歩進んだバージョンであり、このバージョンの機能は追加されず、最終リリース バージョンの機能は同じです。このバージョンは最終リリース前のプレビュー バージョンのようなもので、これがリリースされるということは、最終リリースが遠くないことを示しています。一般ユーザーとして、このソフトウェアを急いで使用したい場合は、このバージョンをダウンロードすることもできます。
● 安定版: 安定版。オープンソースソフトウェアには安定版があり、これがオープンソースソフトウェアの最終リリース版となり、ユーザーは安心して利用することができます。

5. タッチ点位置計算
event.getX(): タッチ点とその左端との距離を示す
event.getRawX: タッチした点と画面左端との距離を示す

6. AdaptorView の setTag と getTag は、ViewHolder を再利用するためのものです。
ItemView の setTag を使用して状態を維持することはできません。たとえば、textView が展開されている場合、List データを変更して、UI をデータで駆動する必要があります。なぜなら、AdapterView の再利用は状態の混乱を招くからです。

7. フラグメントはコンストラクターを通じてフィールド パラメーターを追加できず、getArguments を通じてパラメーターを取得する必要があります。そうしないと、システムがフラグメントを復元するときにクラッシュしやすくなります。

8. コンパイル中に、クラス -> dex の間に変換モニターを追加して、プラグインをカスタマイズしてバイトコードを変更できます。
カスタムの Transform が拡張機能に追加され、パッケージ化フェーズで java->class をコンパイルした後、class->dex の前に、拡張機能内の Transform (カスタムのものを含む) を走査し、それを TransformManager に追加することがわかります。 TransformTask として登録するには、タスクの実行時に、Dex の前にバイトコードを変更するという目的を達成するために、Transform のtransform メソッドを呼び出します。リンク:
https://juejin.cn/post/6974962797973078046

9. デバッグ パッケージを使用して関数を開発した後、リリース パッケージを使用して関数を再検証する必要があります。
例: 質問に回答するために価格を推測する、質問には表示されないバグ

10. Handler を使用する際の null 判定に注意する 同様に、オブジェクトを使用する前に、特にオブジェクトに null 値が割り当てられる可能性がある場合には、null を判定する必要があります。

11. 逆コンパイル


  1. brew install jadxをインストールする

  2. 起動メソッド:jadx-gui

  3. 指定された APK を開くことを選択します

  4. パッケージ名に従って、対応するソースコードを検索します。

12.PermissionX
現在、業界では、達成するために別の小さなトリックを使用することが一般的に認識されています。どのようなトリックですか?実行時権限を申請するためのこれまでの操作はすべてアクティビティで実行されたことを思い出してください。実際、Android は Fragment でも同じ API を提供しているため、Fragment で実行時権限を申請することもできます。
ただし、違いは、Fragment が Activity のようなインターフェイスを持つ必要がないことです。Activity に非表示の Fragment を追加し、この非表示の Fragment に実行時権限 API をカプセル化できます。これは非常に軽量なアプローチであるため、フラグメントを非表示にすることがアクティビティのパフォーマンスに与える影響を心配する必要はありません。
https://juejin.cn/post/6903709311906938893
https://github.com/guolindev/PermissionX


バグ修正の概要

ビューの追加でエラーが報告されます: java.lang.IllegalArgumentException: null の子ビューを ViewGroup に追加できません
原因: addHighLightView の実行時に、追加されるビューが空かどうかが判断されません。
解決策: ビューを追加する前に空かどうかを判断する必要があり、空でない場合は追加できます。
概要: エラーが発生した場合は、ソース コードを確認して、
「ViewGroup に null の子ビューを追加できない」という問題を見つけることができます
(http://androidxref.com/9.0.0_r3/xref/frameworks/base/core/) java/android/view /ViewGroup.java)

2. ネットワーク リクエストによって解析されるデータ データはシリアル化する必要があります。シリアル化しないと、混乱が生じ、解析エラーが発生します。

3. 新しいインターフェース要求の場合、Javaben をマッピングするときに、必ず難読化ファイルをチェックインして、混乱が防止されているかどうかを確認してください。

4. クラッシュを避けるために、EditText setSelection メソッドを呼び出すときは保護に注意してください。
ここに画像の説明を挿入

5. AndroidStudio のデバッグ時に、変数値を設定して NullpointerException シナリオをシミュレートできます。
ここに画像の説明を挿入
6. パブリック String TAG インスタンス変数は基本クラスで定義され、サブクラス (Kotlin コード) は同じ名前の静的定数コンパニオン オブジェクト { const val TAG = “xxx” } を使用します。これによりクラッシュ例外メッセージが発生します。 java.lang.IncompatibilityClassChangeError: 'xx ' は静的フィールドではなくインスタンス フィールドであることが予想されます注: サブクラス (Kotlin) コードで、変数 TAG をクリックすると、親クラス コードが追跡されて入力されます。 Java コードでは、そのような例外はまだ見つかっていません。Kotlin コードを Java に変換した後の表示:





ここに画像の説明を挿入

ここに画像の説明を挿入

問題分析:
プライベートとして宣言されていないフィールドが静的として宣言されておらず、静的として宣言されるように変更された場合、またはその逆の場合、そのフィールドが既存のバイナリによって使用されていると、リンケージ エラー、具体的には IncompatibilityClassChangeError が発生します。他の種類のフィールドが予期されています。広く配布されているコードでは、このような変更は推奨されません。
翻訳:
プライベートとして宣言されていないフィールドが静的として宣言されておらず、静的に宣言されるように変更された場合、またはその逆の場合、フィールドが、別の型のフィールドを予期している既存のバイナリによって使用されている場合、リンク エラー、具体的には IncompatibilityClassChangeError が発生します。このような変更は、広く配布されているコードでは推奨されません。

https://docs.oracle.com/javase/specs/jls/se7/html/jls-13.html#:~:text=If%20a%20field%20that%20is,that%20has%20been%20widely%20distributed 。


UI機能の蓄積

1. ダイアログ:
ダイアログのカスタマイズ、ダイアログの継承、https://www.jianshu.com/p/809623bbc3b6
DialogFragment のカスタマイズ、https://blog.csdn.net/u011272795/article/details/102822028

2. FrameLayout、RelativeLayout、および LinearLayout はすべて、ビューのカスケード効果を実現できます。
RelativeLayout: alignBottom、alignTop、alignParentLeft などを使用します。
LinearLayout: marginTop="-12dp" などを使用します。

3. RemoteImageView で角を丸く設定します:
メソッド 1:
RemoteImageView imageView = (RemoteImageView) view.findViewById(R.id.iv_photo);
// バナー画像の端を半径 8 の丸い角として設定します imageView.setPainterImageShapeType(PainterShapeType) .ROUND_CORNER);
imageView.cornerRadius(AndroidUtil.dp2px(viewGroup.getContext(), 8));
imageView.load(banner.imageUrl);

方法二:
<androidx.cardview.widget.CardView
android:id=”@+id/cv_img_container”
android:layout_width=”@dimen/space_80dp”
android:layout_height=”@dimen/space_80dp”
app:cardCornerRadius=”@dimen/ space_8dp”
android:layout_below=”@id/view_divide”
android:layout_marginEnd=”@dimen/space_6dp”
app:cardElevation=”@dimen/space_0dp”>
<com.ugc.aaf.widget.widget.imageview.ForeExtendedRemoteImageView
android:id =”@+id/riv_product”
android:layout_width=”@dimen/space_80dp”
android:layout_height=”@dimen/space_80dp”
app:imageScaleType=”centerCrop”
app:imgRadioH=”1”
app:imgRadioW=”1” / >
</androidx.cardview.widget.CardView>

4. TextView フォント サイズ適応型
android:autoSizeMaxTextSize="12sp"
android:autoSizeMinTextSize="4sp"
android:autoSizeTextType="uniform"

5. SpannableStringBuilder が setSpan を連続して呼び出す場合、パラメータ Object は同じ参照を使用できません
。それ以外の場合は、最後の設定のみが有効です
https://blog.csdn.net/BigBoySunshine/article/details/48706451

6. 新しい iconFont アイコン ライブラリを作成します

  1. iconFont Web サイトにアクセスして、使用する必要のあるアイコン ttf ファイルをダウンロードします。https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=3494273&keyword=&project_type=&page=
  2. ugc_iconfont.ttf ファイルは、res/font フォルダーの下に配置されます。
  3. style.xml ファイルの下に
    スタイルを追加します。

4.
<androidx.appcompat.widget.AppCompatTextView
style=”@style/UGCIconFont”
android:text=”@string/icAdd”
android:textColor=”@color/gray_cccccc”
android:textSize=”20sp”
android:layout_width=を使用します。 “@dimen/space_24dp”
android:layout_height=”@dimen/space_24dp”
android:layout_gravity=”center”
/>

7. ステータスバーを白、ツ​​ールバーのフォントの黒の背景色を白に設定します。

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar_actionbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:theme="@style/MMyorderLeaveFeedBackTitleTheme"
    android:background="@color/white"
    />
<style name="MMyorderLeaveFeedBackTitleTheme" parent="@style/ThemeOverlay.AppCompat.Light">
    <item name="colorPrimary">#FFFFFF</item>
    <item name="colorPrimaryDark">#FFFFFF</item>
    <item name="textColorPrimary">#000000</item>
    <item name="colorControlNormal">#000000</item>   <!-- 重要,控制左侧箭头为黑色>
</style>
<!-- navigation icon color -->
   <item name="colorControlNormal">@color/my_color</item>

    <!-- color of the menu overflow icon -->
    <item name="android:textColorSecondary">@color/my_color</item

ステータス バーを白に設定します:
Activity onCreate setContentView の後に実行します
try { StatusBarUtil.setTranslucentForImageView(this, 0, findViewById(R.id.ll_content)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { StatusBarUtil. setColor (this, getColor(R.color.white), 0); } StatusBarUtil.setLightMode(this); } catch (Throwable e) { }







ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/adayabetter/article/details/127223888