この記事では、Androidアプリケーションの開発時に遭遇したいくつかの問題と、それらの解決方法について説明します。
静的コンテキスト
問題:静的コンテキストからいくつかのContextメソッドを呼び出せるよう
にしたい(しゃれはごめんなさい)。
解決策: stackoverflowを使用して、静的Applicationクラスを作成するというソリューションを利用しました。
ここでは、注意する必要があります-そしてそれを賢く使用してください。 たとえば、リソースを取得するには-翻訳、写真、スタイル。
使用できない場合: GUI要素を使用する場合や、たとえばLayoutInflatorを使用する場合(例外がスローされます)。
実際には、次のようになります。
public class ApplicationContext extends android.app.Application { @NotNull private static ApplicationContext instance; public ApplicationContext() { instance = this; } @NotNull public static ApplicationContext getInstance() { return instance; } }
そして
AndroidManifest.xml:
<manifest xmlns:a="http://schemas.android.com/apk/res/android"> <application a:name=".ApplicationContext"> // ... </application> </manifest>
低レベルのアプリケーションで高レベルのAndroid APIを使用する
問題:高レベルAPIで使用可能な機能(GUI要素-ビューなど)を使用したい。
解決策: Androidはオープンプラットフォームであるため、ソースコードが利用可能です。 はい、利用できないクラスをライブラリに転送します。 当然、このアプローチには欠点があります。転送されたクラスの操作性を確認し、このレベルのAPIでサポートされていない依存関係を編集する必要があります(幸運です)。
例: NumberPickerはレベル11からのみ使用可能ですが、プロジェクトに転送してレベル4で使用します:
githubを見てくださいXML APIを使用する
問題: Javaオブジェクトをxml表現に変換することがしばしば必要です(たとえば、サービス間でオブジェクトを転送したり、永続化状態で保存したりするため)。
通常、このような場合はJAXBが使用されますが、AndroidプラットフォームではJAXBは使用できません。
解決策:別のライブラリーを使用してください。 たとえば、シンプル(XMLシリアル化)
simple.sourceforge.netを使用し
ました使い方は?最初に、ライブラリをプロジェクトに接続します。
<dependency> <groupId>org.simpleframework</groupId> <artifactId>simple-xml</artifactId> <version>2.6.1</version> <exclusions> <exclusion> <artifactId>stax-api</artifactId> <groupId>stax</groupId> </exclusion> </exclusions> </dependency>
注:除外はstax-apiに設定されています-そうでない場合、プロジェクトはビルドされません(Android APIはサポートされていません)
必要な注釈(@ Root、
Transient 、
Element )でオブジェクトをマークします。
@Root public class Var implements IConstant { @Transient private Integer id; @Element @NotNull private String name; @Element(required = false) @Nullable private String value;
オブジェクトをxmlで保存します。
final StringWriter sw = new StringWriter(); final Serializer serializer = new Persister(); try { serializer.write(vars, sw); } catch (Exception e) { throw new RuntimeException(e); }
xmlからオブジェクトを取得します。
final String value = getVarString(); final Serializer serializer = new Persister(); try { final Vars vars = serializer.read(Vars.class, value);
転送のストレージ(Rクラスの依存関係を残す)
問題: Androidには、クラスRフィールド識別子によって翻訳を受信するためのメカニズムがあり、この翻訳を使用する場合はどこでも、このクラスに依存する必要があります。
解決策:翻訳を名前と言語で保存
するアプリケーションレベルの翻訳キャッシュ。 変換は静的コンテキストから取得されます。
コード例:
public enum TranslationsCache { instance;
その後、たとえば次のように使用できます。
try{
おわりに
上記のすべてが実際に適用されました。
ソースコードは
github.comで入手できます。
android.marketで動作するアプリケーション。
ご清聴ありがとうございました!