この記事では、プログラムの実行中にネットワークからクラス(フラグメントを含む)をダウンロードし、それらをAndroidアプリケーションで使用する方法を見ていきます。 このような技術の実際の応用分野は会話の別のトピックですが、この機能の実装自体は私にとって非常に興味深い仕事のように思えました。
始めましょう。
フラグメントを作成する
まず、
Fragment0フラグメントを作成し、onCreateView()メソッドを実装します。
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
この場合、xmlからマークアップを作成する標準的な方法は機能しないため、最初のフラグメントではプログラムで作成します。
次に、フラグメントを含む
モジュールに基づいて、APKを作成し、unzipを使用してそれを解凍し、
classes.dexファイルをサーバーにアップロードする
必要があります。
クラスローディングを実装します
別のモジュールで 、
NetworkingActivityクラスを作成し、次のメソッドを実装します:
@Override protected void onCreate(Bundle savedInstanceState) {
フラグメントから他のフラグメントを開く
これを行うには、クラス
LoadableFragment (すべてのフラグメントのスーパークラス)で、次のメソッドを実装します。
public void showFragment(String className, Bundle args) { Intent intent = new Intent("jatx.networkingclassloader.ShowFragment"); intent.putExtra("className", className); intent.putExtra("args", args); getActivity().sendBroadcast(intent); }
ここですべてが明確であることを願っています。
次のフラグメントをわずかに異なる方法で作成しようとします。
ネットワークからxmlマークアップをロードします
開始するには、
マークアップファイルを作成してサーバーにアップロードします。 文字列からxmlレイアウトを解析できる
ライブラリをgithubで見つけました。 正しく動作させるには、
少しファイルを作成する必要が
ありました 。
したがって、
LoadableFragmentクラスに次のメソッドを追加します。
protected void loadLayoutFromURL(FrameLayout container, String url) { this.container = container;
これを利用して、フラグメント
Fragment1を作成します。
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { FrameLayout frameLayout = new FrameLayout(getActivity()); loadLayoutFromURL(frameLayout, "http://tabatsky.ru/testing/fragment1.xml"); return frameLayout; } @Override public void onLayoutDownloadSuccess(String xmlAsString) { LinearLayout linearLayout = (LinearLayout) DynamicLayoutInflator.inflate(getActivity(), xmlAsString, container); FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); linearLayout.setLayoutParams(lp); final EditText editText = (EditText) DynamicLayoutInflator.findViewByIdString(linearLayout, "edit_text"); Button button = (Button) DynamicLayoutInflator.findViewByIdString(linearLayout, "button"); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Bundle args = new Bundle(); args.putString("userName", editText.getText().toString()); showFragment("jatx.networkingclassloader.dx.Fragment2", args); } }); }
あとがき
プロジェクトの完全なソースコードは
githubで
表示できます。 完成したAPKは
ここからダウンロードでき
ます 。
そして最後に、このテクノロジーの可能なアプリケーションについていくつかお話したいと思います。たとえば、ユーザーアカウントの種類(有料/無料)に応じてサーバーから異なるclasses.dexを発行できます。これにより、アプリケーションのリバースエンジニアリングの複雑さがわずかに増加します。