Androidの公式ドキュメントによると、「アクティビティ」とは、ユーザーが行うことのできる単一の集中的な活動のことです。
この言葉は、基本的に行動を実行したり、何かと相互作用することを意味する動詞「act」に由来しています。
ビジュアルコンポーネントがなくても「アクティビティ」は作成できますが、ほとんどのアクティビティは、ユーザーが操作できるビューやウィジェットをホストするために作成されます。
したがって、アクティビティは、ユーザーが操作する画面全体を漠然と指すことができます。
このように考えると、アクティビティにできることがいくつかあります。
No. | アクション | 説明 |
---|---|---|
1. | Open new activity |
これは、現在の activity またはスクリーンを置き換えます。 |
2. | 現在の activity を閉じて、もう見えないようにする。Androidシステムは完全には殺さず、バックグランドに置いて、再び戻ってこないようにします。 |
|
3. | 3. 端末を回転させる このアプリでビデオを見たり、ゲームをしたりしているときに、別のレイアウトで見たいとします。このプロセスでは、レイアウトのニーズに対応するために、「アクティビティ」が再現されます。 |
上記のような処理を行うと、アンドロイドシステムは様々なライフサイクルコールバックを発生させます。これらは基本的に、「アクティビティ」のライフサイクルのさまざまな段階で、イベントドリブンな方法で発生するメソッドです。例えば、作成、一時停止、再開、起動、再起動、停止などです。
Activity
のプレゼンテーションメカニズム
アンドロイドでは、「アクティビティ」を様々な方法で表現することができます。
No. | メカニズム | 説明 |
---|---|---|
1. | フルスクリーンウィンドウ : | 1. フルスクリーンウィンドウ:最も一般的な「アクティビティ」の表示方法で、画面全体を使って表示します。 |
2. フローティング・ウィンドウ : | 2. フローティング・ウィンドウ : テーマで windowIsFloating 属性を設定することで、アクティビティ をフローティング・ウィンドウとして設定することができます。 |
|
3. | Embedding : | アクティビティは ActivityGroup を使って別の アクティビティ の中に埋め込むこともできます。 |
しかし、APIレベル13でFragmentsが導入されたことにより、ActivityGroupは廃止されたので、埋め込みはもはや魅力的ではありません。どちらかというと、フラグメントは基本的にサブアクティビティであり、独自のライフサイクルを持っています。
Activity
クラスの定義
プログラムによる activity
の説明も見てみましょう。
まず、このクラスは android.app
パッケージに属しています。
package android.app;
Activity`は他のクラスと同じですが、独自の方法でユニークなクラスでもあります。また、パブリックなので、自分のパッケージの外にある他のパッケージの中でも見ることができ、使うことができます。
public class Activity..{}
クラスであるということは、他のクラスが持っている以下のようなオブジェクト指向の機能も持っています。
- 1.他のクラスから派生したり、派生されたりする能力。
- インターフェースを実装することができる。
- 独自のメソッドやフィールド、内部クラスを持つことができる。
実際、Activity
クラスはContextThemeWrapperクラスから派生しています。
public class Activity extends ContextThemeWrapper..{}
ContextThemeWrapper`はクラスに、ラップされたコンテキストの中にあるものからテーマを操作、変更する能力を与えています。
さらに、Activity
はいくつかのインターフェイスを実装しています。
public class Activity extends ContextThemeWrapper implements LayoutInflater.Factory2 Window.Callback KeyEvent.Callback View.OnCreateContextMenuListener ComponentCallbacks2{}
ActivityのChildrenとGrandChildren
これがアクティビティの直接のサブクラスと間接のサブクラスです。
直接的なサブクラスは以下の通りです。
No. | アクティビティ | 説明 |
---|---|---|
1. FragmentActivity|サポートライブラリを使用してFragmentsやLoader APIを利用したいアクティビティが使用するスーパークラスです。 | ||
2. NativeActivity|純粋にネイティブコードで実装された便利なアクティビティを求める人のためのクラス。 | ||
3. | 3. ListActivity|データソースにバインドされたアイテムのリストを表示することに特化したアクティビティ。 | |
4. | 4. ExpandableListActivity|データ ソースにバインドされたアイテムの拡張可能なリストを表示することに特化したアクティビティ。 | |
5. | 5. AliasActivity|アクティビティにエイリアスのようなメカニズムを提供する。 | 5. AliasActivity|アクティビティにエイリアスのようなメカニズムを提供する。 |
6. | 6. AccountAuthenticatorActivity | AbstractAccountAuthenticatorを実装するアクティビティを作成するためのスーパークラスです。 |
7. | 7. ~ActivityGroup~ | Fragmentsが導入された後のAPI 13で非推奨となりました。それ以前は、複数のアクティビティを組み込んだ画面を作成するための方法でした。 |
さて、これらはアクティビティの子です。
それでは、孫/間接サブクラスを見てみましょう。
No. | 活動内容|主な親|説明 | ||
---|---|---|---|
1. AppCompatActivity|FragmentActivity|AppCompatActivityは、アクションバー機能の利用を計画しているアクティビティのスーパークラスです。 | |||
2. | ActionBarActivity~ | AppCompatActivity | Deprecated. 以前は、アクティビティにアクションバー機能を提供するために使用されていました。現在、その役割はAppCompatActivityに移っています。 |
3. | ~TabActivity~|ActivityGroup|APIレベル13にさかのぼって廃止されました。それ以前は、タブ付きアクティビティを作成するために使用されていましたが、現在はフラグメンツでそれが可能です。 | ||
4. | PreferenceActivity|ListActivity|ユーザーにプリファレンスの階層を表示しようとする場合に使用するスーパークラスです。 | ||
5. | 5.LauncherActivity|ListActivity|与えられた意図に対して実行可能なすべてのアクティビティのリストを表示します。 |
能力 アクティビティクラスがその子供たちに提供するもの
アクティビティは、ユーザーが行うことができる単一の集中した事柄を表すと言われています。
アクティビティは、ユーザーが操作できるビューやウィジェットを使用してレンダリングすることができます。
しかし、ここからは、Activity
クラスが子クラスに与える、より詳細で具体的な機能を、より低いレベルから探っていきましょう。
1. コンテキスト機能
- 様々なパーミッションをチェックする : 例えば、
checkPermission(String permission, int pid, int uid)
は、システム内で実行されている特定のプロセスとユーザーIDが渡されたパーミッションを持っているかどうかを判断します。checkUriPermission(Uri uri, int pid, int uid, int modeFlags)
は、システム内で実行されている特定のプロセスとユーザーIDが渡されたUriなどにアクセスするパーミッションを持っているかどうかを判断します。 -
- アプリケーションサービスへの接続または作成 : これは、
bindService(Intent service, ServiceConnection conn, int flags)
メソッドコールによって行われます。
3.他のContextを作成する : 例えば、createConfigurationContext(Configuration overrideConfiguration)
は、現在のコンテキストのための新しいContextオブジェクトを作成しますが、リソースは渡された構成に合わせて調整されます。createPackageContext(String packageName, int flags)
は、与えられたアプリケーション名のための新しいContextオブジェクトを返します。
- アプリケーションサービスへの接続または作成 : これは、
-
- 関連するデータベースとファイルのリスト : databaseList()
は、このContextのアプリケーションパッケージに関連するプライベートデータベースの文字列配列を提供し、
fileList()`は、このContextのアプリケーションパッケージに関連するプライベートファイルの文字列配列を返す。
- 関連するデータベースとファイルのリスト : databaseList()
-
- 関連付けられたデータベースとファイルを削除する : deleteDatabase(String name)
はこのContextのアプリケーションパッケージに関連付けられたSQLiteDatabaseを削除し、
deleteFile(String name)はこのContextのアプリケーションパッケージに関連付けられたプライベートファイルを削除します。 6.**アプリケーションコンテクストの取得** : Contextの
を介して、現在のContextのパッケージの完全なアプリケーション情報を得ることができます。getApplicationContext()
は、現在のプロセスの単一のグローバルなApplicationオブジェクトを返します。 7.**アプリケーション情報の取得** : getApplicationInfo()
- 関連付けられたデータベースとファイルを削除する : deleteDatabase(String name)
クイックアクティビティの例
1. アクティビティ`を開始するには
アクティビティ "を開始するには、"Intent "オブジェクトが必要です。それでは、「アクティビティ」を開始するメソッドを作ってみましょう。このメソッドは、対象となる activity
のクラス名と、コンテキストオブジェクトを受け取ります。
void start(Context c, Class e){
Intent i = new Intent(,e);
c.startActivity(i);
//a.finish();
}
2. アクティビティ`を終了/キルする方法
アクティビティーを終了させるには、finish()
メソッドを使用します。
void killIntent(Context c){
Intent i = new Intent(c,MainActivity.class);
c.startActivity(i);
c.finish();
}
3. 3. 「アクティビティ」がフォアグラウンドにあるかどうかを判断する方法
このサンプルメソッドでは、ある activity
がフォアグラウンドにあるかどうかを判断します。判定結果はブール値で返されます。
public static boolean isForeground(Context context, String className) {
if (context == null || TextUtils.isEmpty(className)) {
returnfalse;
}
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> list = am.getRunningTasks(1);
if (list != null && list.size() > 0) {
ComponentName cpn = list.get(0).topActivity;
if (className.equals(cpn.getClassName())) {
return true;
}
}
returnfalse;
}
public static boolean isForeground(Activity activity) {
return isForeground(activity, activity.getClass().getName());
}
4.バックプレスの処理方法
現在のアクティビティを終了する前に、ユーザーに警告ダイアログを表示するなど、バックプレスを適切に処理したいとします。その場合、handleBackPress()
メソッドを作成します。
public void handleBackPress() {
mExitDialog = true;
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style
.AlertDialogStyle);
builder.setTitle(R.string.leave_chat)
.setMessage(R.string.leave_chat_desc)
.setCancelable(false)
.setNegativeButton(R.string.cancel,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
mExitDialog = false;
dialog.cancel();
}
})
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//showSaveHistoryDialog();
}
});
AlertDialog alert = builder.create();
alert.show();
alert.getWindow().setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color
.black14)));
}
上記のケースでは、ユーザーが戻るボタンをクリックしたときに、警告ダイアログを表示しています。
Android AppCompatActivity
AppCompatActivity`は、サポートライブラリのアクションバーの機能を利用したいアクティビティのスーパークラスとして機能するクラスです。
アクティビティ内で android.support.v7.app.ActionBar
を使用するには、以下の条件があります。
-
APIレベル7
以上で動作していること。
- このクラスを拡張する。
-
- アクティビティのテーマを
android.support.v7.appcompat.R.style#Theme_AppCompat Theme.AppCompat
または同様のテーマに設定します。
- アクティビティのテーマを
テーマは AndroidManifest.xml
で設定されます。
<activity
android_name=".MainActivity"
android_label="@string/app_name"
android_theme="@style/AppTheme.NoActionBar">....</activity>
AppCompatActivityは、
android.support.v7.app`パッケージの中で定義されています。
package android.support.v7.app;
これは android.support.v4.app.FragmentActivity
から派生したものです。
public class AppCompatActivity extends FragmentActivity{}
そして、いくつかのインターフェイスを実装しています。
public class AppCompatActivity extends FragmentActivity implements AppCompatCallback,TaskStackBuilder.SupportParentable, ActionBarDrawerToggle.DelegateProvider {}
AppCompatActivityから派生したクラスの例を示します。
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
テーマ「AppCompatActivity」の設定
AppCompatActivity」は、他のアクティビティテーマと同様に、androidmanifestで設定することができます。
<activity
android_name=".MainActivity"
android_label="@string/app_name"
android_theme="@style/AppTheme.NoActionBar">....</activity>
または、プログラム的には setTheme()
メソッドで設定できます。
public void setTheme(@StyleRes final int resid) {}
AppCompatActivityで使用されるカスタムマテリアルテーマを作成することができます。
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
</resources>
そして、そのテーマをアプリケーション全体にグローバルに設定するには、android:theme="..."
属性を使います。
<application
android_allowBackup="true"
android_icon="@mipmap/ic_launcher"
android_label="@string/app_name"
android_roundIcon="@mipmap/ic_launcher_round"
android_supportsRtl="true"
android_theme="@style/AppTheme">
<activity android_name=".MainActivity">
</activity>
</application>
AppCompatActivity
ActionBarの取得
AppCompatActivity`では、アクションバーへの参照を取得するためのメソッドが用意されています。
public ActionBar getSupportActionBar(){}
アクションバーがない場合は、null
が返されます。
AppCompatActivityでToolBarをActionBarとして使用する。
アクションバーの代わりに、android.support.v7.widget.Toolbar
を使うことができます。ツールバーには、柔軟な使い方やカスタマイズができるというメリットがあります。
アクションバーは通常、アクティビティの不透明なウィンドウ装飾の一部です。そのため、フレームワークによって制御されます。
一方、ツールバーは、アプリケーションのレイアウトの中で使用することができます。そのため、柔軟性があります。
例えば、次のようなツールバーが定義されているとします。
...
<android.support.v7.widget.Toolbar
android_id="@+id/toolbar"
android_layout_width="match_parent"
android_layout_height="?attr/actionBarSize"
android_background="?attr/colorPrimary"
app_popupTheme="@style/AppTheme.PopupOverlay" />
...
というツールバーが activity_main.xml
の中に定義されているとします。
このツールバーをアクションバーとして使用するには、setSupportActionBar()
で、toolbar
の参照をパラメータとして渡します。
public void setSupportActionBar(@Nullable Toolbar toolbar) {}
例を示します。
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
クリアするには null
を渡します。
Android Studio - Empty Activity Projectの作成
Android Studioで空のアクティビティを作成する方法
Android StudioでEmpty Activityテンプレートを使ってプロジェクトを作成する方法をご紹介します。Android Studioを使って、空のアクティビティを作成する方法を紹介します。
空のアクティビティは、アンドロイド開発のためのテンプレートです。1つのjavaファイルと1つのxmlレイアウトファイルを生成してくれるので、最も簡単に始めることができるテンプレートです。
以下、その手順をご紹介します。
- まず、android studioで空のプロジェクトを作成します。ファイル」→「新規プロジェクト」を選択します。
- アプリケーション名を入力し、会社名を選びます。
- 最小限のSDKを選択します。
- Empty activityを選択します。
- 完了」をクリックします。
これで、以下のようなプロジェクトが生成されます。
番号 | 番号|名前|タイプ|説明 | ||
---|---|---|---|
activity_main.xml|XMLレイアウト|MainActivityビューにインフレーションされ、ここにビューやウィジェットを追加します。 | |||
2. | MainActivity.java | クラス | ランチャーアクティビティ |
このアクティビティは、自動的にandroid_manifest.xmlに登録されます。Androidアクティビティはコンポーネントなので、通常はアプリケーションコンポーネントとして登録する必要があります。
手動で作成した場合は、以下のように<application>...<application>
の中に登録し、MainActivity
を自分のアクティビティ名に置き換えます。
<activity android_name=".MainActivity">
<intent-filter>
<action android_name="android.intent.action.MAIN" />
<category android_name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
インテントフィルターとして、1つのアクションとカテゴリーが指定されているのがわかります。カテゴリはMainActivityをランチャーアクティビティにしています。ランチャーアクティビティは、アンドロイドアプリが起動したときに最初に実行されます。
Android Studio - Basic Activity Projectの作成
How to Create a Project in android studio with Basic Activity template. (英語のみ)
Android Studio - Creating Basic Activity Project How to Create Project in android studio with Basic Activity template. これは初心者向けのチュートリアルで、基本的なテンプレートに基づいてアンドロイドのプロジェクトを作成する方法を説明しています。
以下、その手順をご紹介します。
- まず、android studioで新しいプロジェクトを作成します。File --> New Projectを選択してください。
- アプリケーション名を入力し、会社名を選択します。
- 最小限のSDKを選択します。
- Basic activityを選択します。
- 完了」をクリックします。
基本アクティビティでは、レイアウトにツールバーとフローティングアクションボタンがすでに追加されています。
通常、このオプションでは2つのレイアウトが生成されます。
いいえ。 | 番号|名前|タイプ|説明 |
---|---|
Activity_main.xml|XMLレイアウト|MainActivityレイアウトにインフレーションされます。通常、ツールバーを備えたappbarlayoutを含み、フローティングアクションボタンも備えています。 | |
2. | content_main.xml|XMLレイアウト|activity_main.xmlにインクルードされます。 |
3. | MainActivity.java|クラス|メインアクティビティ。 |
この例では、基本的なアクティビティを使用しています。
このアクティビティは、android_manifest.xmlに自動的に登録されます。Androidアクティビティはコンポーネントなので、通常はアプリケーションコンポーネントとして登録する必要があります。
手動で作成した場合は、以下のように<application>...<application>
の中に登録し、MainActivity
をアクティビティ名に置き換えます。
<activity android_name=".MainActivity">
<intent-filter>
<action android_name="android.intent.action.MAIN" />
<category android_name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
インテントフィルターとして、アクションとカテゴリーが指定されているのがわかります。カテゴリはMainActivityをランチャーアクティビティにしています。ランチャーアクティビティは、アンドロイドアプリが実行されたときに最初に実行されます。
Basic Activityプロジェクトを作成するメリット
このプロジェクトでは、オプションとして、基本アクティビティではなく、空のアクティビティを選択することができます。
しかし、基本アクティビティには以下のような利点があります。
No. | アドバンテージ |
---|---|
1.アクションバーとしての機能を持ちながら、簡単にカスタマイズできるレディメイドのツールバーを提供します。 | |
2. マテリアルデザインのアプリバーコンセプトを実装したアプリバーレイアウトを提供します。 | |
3. | 3.FloatinActionButtonを提供し、特に以下のような例でクイックアクションを開始するために容易に使用することができます。 |
4. | 4. カスタムコンテンツビューやウィジェットを、ツールバーのようなテンプレート機能から切り離すことができます。 |
生成されたプロジェクト構造
AndroidStudio は、いくつかのファイルやディレクトリを介して、デフォルトの設定を持つプロジェクトを生成します。
ここでは、その中でも特に重要なものを紹介します。
番号 | ファイル | 主な責任 |
---|---|---|
1. build/ |アプリケーションのビルドからコンパイルされたリソースや、アンドロイドツールで生成されたクラスを含むディレクトリです。このようなツールとして、R.java ファイルがあります。R.java`ファイルは、通常、アプリケーションのリソースへの参照を保持しています。 |
||
2. | libs/ |
プロジェクトで使用するライブラリを格納します。 |
3. | 3. src/main/ |
アプリケーションのソースコードを格納します。 |
4. | 4. src/main/java/ |
パッケージとして整理されたJavaクラスが格納されています。 |
5. | 5. src/main/res/ |
以下のプロジェクトリソースフォルダが格納されています。 |
6. | 6. src/main/res/drawable/ |
描画リソースが格納されています。 |
7. | 7. src/main/res/layout/ |
レイアウトリソースが格納されている。 |
8. | src/main/res/menu/ |
メニューリソースのXMLコードが格納されている。 |
9. | 9. src/main/res/values/ | src/main/res/values/ には、バリューリソースのXMLコードが含まれています。これは、名前と値のペアのセットを定義するもので、文字列、スタイル、色などがあります。 |
|
10. | アプリケーション名、パッケージ名、パーミッション、アクティビティ、インテントなど、アンドロイドシステムに必要な基本的な情報を定義しています。 | |
11. | このファイルには、アプリケーション名、パッケージ名、パーミッション、アクティビティ、インテントなど、アンドロイドシステムが必要とする基本的な情報が定義されています。 |
Androidアクティビティ - あるアクティビティから別のアクティビティへプリミティブを渡す
あるアクティビティから別のアクティビティにプリミティブデータ型を渡す方法を見てみましょう。渡すのは
- 文字列
- 整数
- Boolean(Via CheckBox)
最初のアクティビティ
第2のアクティビティ
を2つ目のアクティビティに移動させて、2つ目のアクティビティで表示しています。
Gradleファイル
アプリレベルのbuild.gradle
ファイルで依存関係を追加していきます。
1. ビルド.gradle
build.gradleファイルのアプリレベルは以下の通りです。
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
testImplementation 'junit:junit:4.12'
implementation 'com.android.support:appcompat-v7:24.2.1'
implementation 'com.android.support:design:24.2.1'
}
`
レイアウトリソース
3つのxmlレイアウトがあります。
- アクティビティメイン.xml
2.コンテンツメイン.xml
3.アクティビティ_セカンド.xml
1.activity_main.xml
- メインアクティビティのテンプレートレイアウトです。
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
android_layout_width="match_parent"
android_layout_height="match_parent"
android_fitsSystemWindows="true"
tools_context="com.tutorials.hp.primitivespassing.MainActivity">
<android.support.design.widget.AppBarLayout
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android_id="@+id/toolbar"
android_layout_width="match_parent"
android_layout_height="?attr/actionBarSize"
android_background="?attr/colorPrimary"
app_popupTheme="@style/AppTheme.PopupOverlay" />
</android.support.design.widget.AppBarLayout>
<include layout="@layout/content_main" />
<android.support.design.widget.FloatingActionButton
android_id="@+id/fab"
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_layout_gravity="bottom|end"
android_layout_margin="@dimen/fab_margin"
android_src="@android:drawable/ic_dialog_email" />
</android.support.design.widget.CoordinatorLayout>
2. content_main.xml
- ここにエディットテキストとチェックボックスを追加しましょう。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android_layout_width="match_parent"
android_layout_height="match_parent"
android_paddingBottom="@dimen/activity_vertical_margin"
android_paddingLeft="@dimen/activity_horizontal_margin"
android_paddingRight="@dimen/activity_horizontal_margin"
android_paddingTop="@dimen/activity_vertical_margin"
app_layout_behavior="@string/appbar_scrolling_view_behavior"
tools_context="com.tutorials.hp.primitivespassing.MainActivity"
tools_showIn="@layout/activity_main">
<LinearLayout
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_orientation="vertical">
<android.support.design.widget.TextInputEditText
android_id="@+id/nameTxt"
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_enabled="true"
android_focusable="true"
android_hint="Name"
android_textSize="25dp"
android_textStyle="bold" />
<android.support.design.widget.TextInputEditText
android_id="@+id/txtID"
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_enabled="true"
android_focusable="true"
android_hint="ID"
android_textSize="25dp"
android_textStyle="bold" />
<LinearLayout
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_orientation="horizontal"
android_padding="5dp">
<TextView
android_layout_width="250dp"
android_layout_height="wrap_content"
android_text="Technology Exists ??"
android_textSize="25dp"
android_textStyle="bold" />
<CheckBox
android_id="@+id/techExists"
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_checked="true"
android_textSize="25dp" />
</LinearLayout>
<Button android_id="@+id/sendBtn"
android_layout_width="wrap_content"
android_layout_height="60dp"
android_text="Send"
android_clickable="true"
android_padding="5dp"
android_background="#009968"
android_textColor="@android:color/white"
android_textStyle="bold"
android_textSize="20dp" />
</LinearLayout>
</RelativeLayout>
3. activity_second.xml
- 2つ目のアクティビティのコードです。
- このアクティビティは、メインのアクティビティからデータを受け取り、ここに表示します。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android_layout_width="match_parent"
android_layout_height="match_parent"
android_paddingBottom="@dimen/activity_vertical_margin"
android_paddingLeft="@dimen/activity_horizontal_margin"
android_paddingRight="@dimen/activity_horizontal_margin"
android_paddingTop="@dimen/activity_vertical_margin"
tools_context="com.tutorials.hp.primitivespassing.SecondActivity">
<LinearLayout
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_orientation="vertical">
<LinearLayout
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_orientation="horizontal"
android_padding="5dp">
<TextView
android_layout_width="250dp"
android_layout_height="wrap_content"
android_text="NAME"
android_textSize="25dp"
android_textStyle="bold" />
<TextView
android_id="@+id/nameTxtSecond"
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_text="value received"
android_textSize="25dp" />
</LinearLayout>
<LinearLayout
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_orientation="horizontal"
android_padding="5dp">
<TextView
android_layout_width="250dp"
android_layout_height="wrap_content"
android_text="ID"
android_textSize="25dp"
android_textStyle="bold" />
<TextView
android_id="@+id/txtIDSecond"
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_text="value received"
android_textSize="25dp" />
</LinearLayout>
<LinearLayout
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_orientation="horizontal"
android_padding="5dp">
<TextView
android_layout_width="250dp"
android_layout_height="wrap_content"
android_text="Technology Exists ??"
android_textSize="25dp"
android_textStyle="bold" />
<CheckBox
android_id="@+id/techExistsSecond"
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_checked="true"
android_textSize="25dp" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
javaクラス
2つのクラス、2つのアクティビティがあります。
- MainActivity.java
- SecondActivity.java
1. MainActivityクラス
- 私たちのMainActivityです。
- このアクティビティから2つ目のアクティビティにデータを渡します。
package com.tutorials.hp.primitivespassing;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.TextInputEditText;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
public class MainActivity extends AppCompatActivity {
//DECLARE VIEWS
private TextInputEditText txtName, txtID;
private CheckBox chkTechnologyExists;
private Button sendBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
this.initializeViews();
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
//WHEN SEND BTN IS CLICKED,SEND
sendBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sendData();
}
});
}
/*
REFERENCE VIEWS WE ARE USING
*/
private void initializeViews() {
txtName = (TextInputEditText) findViewById(R.id.nameTxt);
txtID = (TextInputEditText) findViewById(R.id.txtID);
chkTechnologyExists = (CheckBox) findViewById(R.id.techExists);
sendBtn = (Button) findViewById(R.id.sendBtn);
}
/*
SEND DATA TO SECOND ACTIVITY
*/
private void sendData() {
//GET PRIMITIVE VALUES TO SEND
String name = txtName.getText().toString();
int id = Integer.parseInt(txtID.getText().toString());
Boolean techExists = chkTechnologyExists.isChecked();
//PACK THEM IN AN INTENT OBJECT
Intent i = new Intent(this, SecondActivity.class);
i.putExtra("NAME_KEY", name);
i.putExtra("ID_KEY", id);
i.putExtra("TECHEXISTS_KEY", techExists);
//LETS LEAVE OUR TXTS CLEARED
txtName.setText("");
txtID.setText("");
//START SECOND ACTIVITY
this.startActivity(i);
}
}
2. セカンドアクティビティクラス
- 2つ目のアクティビティです。
- メインのアクティビティからデータを受け取り、テキストビューやチェックボックスに表示します。
package com.tutorials.hp.primitivespassing;
import android.support.design.widget.TextInputEditText;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.CheckBox;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
public class SecondActivity extends AppCompatActivity {
//DECALRE SECOND ACTIVITY VIEWS
TextView txtName2;
TextView txtID2;
CheckBox chkTechnologyExists2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
//INITIALIZE THESE VIEWS
txtName2 = (TextView) findViewById(R.id.nameTxtSecond);
txtID2 = (TextView) findViewById(R.id.txtIDSecond);
chkTechnologyExists2 = (CheckBox) findViewById(R.id.techExistsSecond);
//RECEIVE DATA FROM MAIN ACTIVITY
String name = getIntent().getStringExtra("NAME_KEY");
int id = getIntent().getIntExtra("ID_KEY", 0);
Boolean techExists = getIntent().getBooleanExtra("TECHEXISTS_KEY", false);
//SHOW A TOAST
Toast.makeText(SecondActivity.this, name, Toast.LENGTH_LONG).show();
//SET THE DATA TO OUR LOCAL VIEWS
txtName2.setText(name);
txtID2.setText(String.valueOf(id));
chkTechnologyExists2.setChecked(techExists);
}
}
Android ListActivity
AndroidのListActivityのチュートリアルと例です。
ListActivityは、配列やCursorなどのデータソースにバインドすることで、アイテムのリストを表示するactivityです。また、ListActivityは、ユーザがアイテムを選択したときのイベントハンドラを公開しています。
これは、Activityクラスから派生したクラスです。ListActivityは、ListViewを使用する予定がある場合に使用することを意図しています。実際、ListViewオブジェクトをホストしており、さまざまなデータソース(通常は配列やクエリ結果を保持するCursor)にバインドすることができます。
ListActivity APIの定義
ListActivityはActivityクラスを継承しています。
public class ListActivity extends Activity
継承の階層は以下の通りです。
java.lang.Object
↳ android.content.Context
↳ android.content.ContextWrapper
↳ android.view.ContextThemeWrapper
↳ android.app.Activity
↳ android.app.ListActivity
リストアクティビティのサブクラス
ListActivityから派生したクラスを紹介します。
No. | クラス | 説明 |
---|---|---|
1.LauncherActivity|与えられた意図に対して実行可能なすべてのアクティビティのリストを表示するクラス。クリックされると起動します。 | ||
2. | PreferenceActivity|ユーザーにプリファレンスの階層を表示するアクティビティのベースクラスです。 |
画面レイアウト
ListActivityのデフォルトのレイアウトは、1つの全画面リストを画面の中央に配置したものです。しかし、必要に応じて、onCreate()
のsetContentView()
で独自のビューレイアウトを設定することで、画面レイアウトをカスタマイズすることができます。これを行うには、独自のビューには、id code>"@android:id/list"</code (コード内にある場合はlist)を持つListViewオブジェクトが含まれていなければなりません。
オプションとして、カスタムビューには、リストビューが空になったときに表示される任意のタイプの別のビューオブジェクトを含めることができます。この "空のリスト "ノティファイアは、id "android:id/empty"
を持たなければなりません。なお、空のビューが存在する場合、表示するデータがないときにはリストビューは非表示になります。
次のコードは、(醜い)カスタム画面のレイアウトを示しています。緑色の背景のリストと、赤色の「データなし」メッセージが交互に表示されています。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android_orientation="vertical"
android_layout_width="match_parent"
android_layout_height="match_parent"
android_paddingLeft="8dp"
android_paddingRight="8dp">
<ListView android_id="@android:id/list"
android_layout_width="match_parent"
android_layout_height="match_parent"
android_background="#00FF00"
android_layout_weight="1"
android_drawSelectorOnTop="false"/>
<TextView android_id="@android:id/empty"
android_layout_width="match_parent"
android_layout_height="match_parent"
android_background="#FF0000"
android_text="No data"/>
</LinearLayout>
Android ListActivityの代表的な例
このセクションでは、ListActivity の完全な例をいくつか紹介します。
1. ListActivityとOnItemClick
この最初の例では、単純な配列からデータを ListActivity に入力する方法を見てみます。次に、OnItemClick イベントの処理方法を見ていきます。
使用しているAPI
まず、この例で使用するいくつかのAPIを定義してみましょう。
(a). ListActivity(リストアクティビティ
このクラスは android.app
に属しています。アクティビティ](https://camposha.info/android/activity)であり、配列やCursorなどのデータソースにバインドすることでアイテムのリストを表示し、ユーザーがアイテムを選択したときにイベントハンドラを公開します。
(b). バンドル。
Bundleは、String値から様々なParcelableタイプへのマッピングです。
バンドルについてはこちらをご覧ください。
(c). ビュー (英語)
ユーザーインターフェースコンポーネントの基本的な構成要素を表すクラスです。ビューは、画面上の長方形の領域を占有し、描画やイベント処理を行います。
ビューについてはこちらをご覧ください。
(c). ArrayAdapter.
ArrayAdapter は,任意のオブジェクトの配列をバックに持つ具象的な BaseAdapter です.デフォルトでは,このクラスは,提供されたリソース ID が単一の TextView を参照することを想定しています.
ArrayAdapter についてはこちらをご覧ください。
(d). ListView (リストビュー)
ListView は、垂直方向にスクロールするリストにアイテムを表示するビューです。アイテムは、このビューに関連付けられた ListAdapter から得られます。
ListViewについてはこちらをご覧ください。
MyListActivity.java
import android.app.ListActivity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class MyListActivity extends ListActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_my_list);
String[] values = new String[] { "Android", "iPhone", "WindowsMobile",
"Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X",
"Linux", "OS/2" };
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,values);
setListAdapter(adapter);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id){
String item = (String) getListAdapter().getItem(position);
Toast.makeText(this, item + " selected", Toast.LENGTH_LONG).show();
}
}
activity_my_list.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
android_layout_width="match_parent"
android_layout_height="match_parent"
tools_context="com.codekul.myandroidlistactivity.MyListActivity">
<TextView
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_text="Hello World!"
app_layout_constraintBottom_toBottomOf="parent"
app_layout_constraintLeft_toLeftOf="parent"
app_layout_constraintRight_toRightOf="parent"
app_layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
ダウンロード
No. | 場所 | リンク |
---|---|---|
1. | GitHub | Browse |
2. | GitHub | Original Creator: @1sumit |
2. ListActivityとArrayAdapterの例
ListActivityにCatNamesを入力し、Clickイベントを処理するようにしましょう。ここではレイアウトは必要ありません。
MainActivity.java
import android.app.ListActivity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class MainActivity extends ListActivity {
final String[] catNamesArray = new String[] { "Рыжик", "Барсик", "Мурзик",
"Мурка", "Васька", "Томасина", "Бобик", "Кристина", "Пушок",
"Дымка", "Кузя", "Китти", "Барбос", "Масяня", "Симба" };
private ArrayAdapter<String> mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mAdapter = new ArrayAdapter<>(this,
android.R.layout.simple_list_item_1, catNamesArray);
setListAdapter(mAdapter);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
}
}
ダウンロード
No. | 場所 | リンク | |
---|---|---|---|
1. | GitHub | ダウンロード | |
2. | GitHub | Browse | |
2. | GitHub | Original Creator: @disiol | 3. |
3. AsyncTaskを使ったListActivity
MainActivity.java
import android.app.ListActivity;
import android.content.Intent;
import android.os.AsyncTask;
import android.view.View;
import android.widget.Adapter;
import android.widget.ListView;
import java.util.List;
public final class AppPickerActivity extends ListActivity {
private AsyncTask<Object,Object,List<AppInfo>> backgroundTask;
@Override
protected void onResume() {
super.onResume();
backgroundTask = new LoadPackagesAsyncTask(this);
backgroundTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
@Override
protected void onPause() {
AsyncTask<?,?,?> task = backgroundTask;
if (task != null) {
task.cancel(true);
backgroundTask = null;
}
super.onPause();
}
@Override
protected void onListItemClick(ListView l, View view, int position, long id) {
Adapter adapter = getListAdapter();
if (position >= 0 && position < adapter.getCount()) {
String packageName = ((AppInfo) adapter.getItem(position)).getPackageName();
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
intent.putExtra("url", "market://details?id=" + packageName);
setResult(RESULT_OK, intent);
} else {
setResult(RESULT_CANCELED);
}
finish();
}
}
4. ListActivity - クリックして新しいアクティビティを開く
これはListActivityの例で、ListActivityにアイテムを表示する方法を見ています。また、ユーザーが1つのアイテムをクリックすると、新しいアクティビティを開きます。
MainActivity.java
import android.app.Activity;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class MainActivity extends ListActivity {
String[] names;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
names = getResources().getStringArray(R.array.friends);
setListAdapter(new ArrayAdapter<String>(this, R.layout.friend_item, names));
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Intent in = new Intent(this, SecondActivity.class);
in.putExtra("message", getString(R.string.show_greetings)+ " " + names[(int) id] + "!" );
startActivity(in);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
SecondActivity.java
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Intent in = getIntent();
TextView txtName = (TextView) findViewById(R.id.txtGreetingName);
txtName.setText(in.getStringExtra("message"));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_second, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
activity_main.xml
<RelativeLayout
android_layout_width="match_parent"
android_layout_height="match_parent"
android_paddingLeft="@dimen/activity_horizontal_margin"
android_paddingRight="@dimen/activity_horizontal_margin"
android_paddingTop="@dimen/activity_vertical_margin"
android_paddingBottom="@dimen/activity_vertical_margin"
tools_context=".MainActivity">
<TextView android_text="@string/hello_world"
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_textSize="24sp"
android_layout_alignParentTop="true"
android_layout_centerHorizontal="true"
android_layout_marginTop="54dp" />
</RelativeLayout>
activity_second.xml
<RelativeLayout
android_layout_width="match_parent"
android_layout_height="match_parent" android_paddingLeft="@dimen/activity_horizontal_margin"
android_paddingRight="@dimen/activity_horizontal_margin"
android_paddingTop="@dimen/activity_vertical_margin"
android_paddingBottom="@dimen/activity_vertical_margin"
tools_context="com.example.paulorogerio.friendgreeting.SecondActivity">
<TextView android_text="@string/hello_world"
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_textSize="24sp"
android_gravity="center_vertical|center_horizontal"
android_id="@+id/txtGreetingName"
android_layout_alignParentTop="true"
android_layout_centerHorizontal="true"
android_layout_marginTop="55dp" />
</RelativeLayout>
friend_item.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView
android_layout_width="match_parent" android_layout_height="match_parent"
android_text="Friend Name"
android_gravity="center_vertical|center_horizontal"
android_textSize="24sp"
android_padding="20dp">
</TextView>
ダウンロード
No. | 場所 | リンク |
---|---|---|
1. | GitHub | ダウンロード |
2. | GitHub | Browse |
2. | GitHub | Original Creator: @paulonova |
5. ListActivity - アセットに格納されたXMLからの入力
この例では、XmlPullParser を使用して、アプリケーションの Assets ディレクトリに格納されている XML ドキュメントを解析する方法を見てみましょう。
この例では、XmlPullParser を使用して、アプリケーションの Assets ディレクトリに保存されている XML ドキュメントを解析する方法を見ていきます。
XML ドキュメントのタイトル、リンク、画像を ListView にロードします。assetsフォルダからXMLをInputStreamに開きます。そして、XmlPullParser を使って XML を解析する ParseXML()
メソッドを用意します。
ImagesAdapterクラスは,XMLからの画像とテキストをカスタムリストビューに変換します.このクラスは,ベースとなるアダプタクラスとして ArrayAdapter を使用しています.
ParseXML.java
この ParseXML
がメインのアクティビティです。
package com.example.parsexml;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.ListView;
public class ParseXML extends Activity {
InputStream xmlStream;
ArrayList<ItemData> list;
XMLHandler handler;
ListView listView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_parse_xml);
try {
xmlStream = this.getAssets().open("ItemXML.xml");
ParseXML();
list = handler.getItemList();
LoadImagesFromUrl();
ImageAdapter adapter = new ImageAdapter(ParseXML.this, R.layout.imagelist, list);
listView = (ListView) findViewById(R.id.imageList);
listView.setAdapter(adapter);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_parse_xml, menu);
return true;
}
public void ParseXML(){
try {
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader reader = sp.getXMLReader();
handler = new XMLHandler();
reader.setContentHandler(handler);
reader.parse(new InputSource(xmlStream));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void LoadImagesFromUrl(){
for (int i=0; i<list.size();i++){
LoadChart loader = new LoadChart(ParseXML.this, list.get(i).link);
loader.execute();
list.get(i).bitmap = loader.getBitmap();
}
}
}
ItemData.java
これはモデルクラスで、ListViewアイテムを構成する1つのXML要素を表します。タイトル、リンク、そしてビットマップを持ちます。
package com.example.parsexml;
import android.graphics.Bitmap;
public class ItemData {
String title;
String link;
Bitmap bitmap;
public Bitmap getBitmap() {
return bitmap;
}
public void setBitmap(Bitmap bitmap) {
this.bitmap = bitmap;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
}
ImageAdapter.java
これは,ArrayAdapter
から派生したカスタムアダプタクラスです.ViewHolder パターンを使用して,リサイクルされるビューを保持します。ViewHolder は,TextView と ImageView のウィジェットを保持してリサイクルするための単純なクラスで,getView()
メソッドが呼ばれるたびに膨らむことはありません。
package com.example.parsexml;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class ImageAdapter extends ArrayAdapter{
ViewHolder holder;
Context ctx;
List<ItemData> list;
LoadChart loader;
public ImageAdapter(Context context, int textViewResourceId,
List<ItemData> objects) {
super(context, textViewResourceId, objects);
ctx = context;
list = objects;
// TODO Auto-generated constructor stub
}
private class ViewHolder{
TextView titleView;
ImageView img;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
if(convertView == null){
LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(ctx.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.imagelist, null);
holder = new ViewHolder();
holder.img = (ImageView) convertView.findViewById(R.id.linkimage);
holder.titleView = (TextView) convertView.findViewById(R.id.title);
convertView.setTag(holder);
}
else{
holder = (ViewHolder) convertView.getTag();
}
holder.titleView.setText(list.get(position).title);
loader = new LoadChart(ctx, holder.img, list.get(position).link);
loader.execute();
return convertView;
}
}
XMLHandler.java
このクラスは、org.xml.sax.helpers.DefaultHandler
クラスから派生します。DefaultHandlerは、SAX2のイベントハンドラのデフォルトのベースクラスです。このクラスでは、startElement()
、endElement()
、characters()
といったいくつかのメソッドをオーバーライドします。
package com.example.parsexml;
import java.util.ArrayList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class XMLHandler extends DefaultHandler{
private ArrayList<ItemData> itemList = new ArrayList<ItemData>();
String value = "";
ItemData item = null;
Boolean flag = false;
public ArrayList<ItemData> getItemList() {
return itemList;
}
public void setItemList(ArrayList<ItemData> itemList) {
this.itemList = itemList;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
if(flag){
value = new String(ch, start, length);
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
flag = false;
if(localName.equalsIgnoreCase("title")){
item.setTitle(value);
}
if(localName.equalsIgnoreCase("link")){
item.setLink(value);
}
if(localName.equalsIgnoreCase("item")){
itemList.add(item);
}
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
flag = true;
value = "";
if(localName.equalsIgnoreCase("item")){
item = new ItemData();
}
}
}
LoadChart.java
このクラスは、抽象的なasynctaskクラスから派生します。これにより、XMLを別のスレッドで読み込むことができます。
package com.example.parsexml;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.ImageView;
public class LoadChart extends AsyncTask<Void, Void, Bitmap> {
private ImageView img;
private Context con;
static String urlString ;
Bitmap bitmap= null;
public Bitmap getBitmap() {
return bitmap;
}
public void setBitmap(Bitmap bitmap) {
this.bitmap = bitmap;
}
public LoadChart(Context context, ImageView img1, String url) {
this.img = img1;
this.con = context;
urlString = url;
}
public LoadChart(Context context, String url) {
this.urlString = url;
this.con = context;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Bitmap doInBackground(Void... params) {
Bitmap bitmap = DownloadImage();
return bitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
this.bitmap = bitmap;
//img.setImageBitmap(bitmap);
}
private static InputStream OpenHttpConnection(String urlString)
throws IOException {
Log.d("palval", "OpenHttpConnection");
InputStream in = null;
int response = -1;
URL url = new URL(urlString);
URLConnection conn = url.openConnection();
if (!(conn instanceof HttpURLConnection))
throw new IOException("Not an HTTP connection");
try {
HttpURLConnection httpConn = (HttpURLConnection) conn;
httpConn.setAllowUserInteraction(false);
httpConn.setInstanceFollowRedirects(true);
httpConn.setRequestMethod("GET");
httpConn.connect();
response = httpConn.getResponseCode();
if (response == HttpURLConnection.HTTP_OK) {
in = httpConn.getInputStream();
}
String res = Integer.toString(response);
} catch (Exception ex) {
throw new IOException("Error connecting");
}
return in;
}
public static Bitmap DownloadImage() {
Log.d("palval", "DownloadImage");
Bitmap bitmap = null;
InputStream in = null;
try {
//in = OpenHttpConnection("https://chart.googleapis.com/chart?chs=440x220&chd=t:60,40&cht=p3&chl=Hello|World");
in = OpenHttpConnection(urlString);
bitmap = BitmapFactory.decodeStream(in);
in.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return bitmap;
}
}
**ダウンロード
No. | 場所 | リンク |
---|---|---|
1. | GitHub | ダウンロード |
2. | GitHub | Browse |
2. | GitHub | Original Creator: @bansal2211 |
Android ListActivity - Images,Text and OnItemClick ArrayAdapterを使ったアクティビティ
Android ListActivity Images Text.
これはアンドロイドのカスタムリストビューのチュートリアルです。リストビューに画像とテキストを表示する方法です。
セクション 1 : CustomAdapter クラス
これは,CustomAdapter クラスです.これは,android.widget.ArrayAdapter
のサブクラスになります.ArrayAdapter についての詳細はこちらをご覧ください.
これは,我々のアダプタクラスです.
package com.tutorials.customlistviewarrayadapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class CustomAdapter extends ArrayAdapter<String>{
final Context c;
String[] values;
//CONSTRUCTOR
public CustomAdapter(Context context, String[] values) {
super(context,R.layout.activity_main, values);
this.c=context;
this.values=values;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflator=(LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//INFLATE OUR XML LAYOUT TO ROW
View row=inflator.inflate(R.layout.activity_main, parent,false);
//DECLARE FIELDS CONTAINED IN OUR LAYOUR
TextView tv=(TextView) row.findViewById(R.id.textView1);
ImageView img=(ImageView) row.findViewById(R.id.imageView1);
//GET AN ITEM FROM ARRAY
String item=values[position];
//DYNAMICALLY SET TEXT AND IMAGES DEPENDING ON ITEM IN ARRAY
if(item.equals("android"))
{
tv.setText(item+" Programming language");
img.setImageResource(R.drawable.android);
}else if(item.equals("java"))
{
tv.setText(item+" Programming language");
img.setImageResource(R.drawable.java);
}else if(item.equals("c#"))
{
tv.setText(item+" Programming language");
img.setImageResource(R.drawable.csharp);
}else if(item.equals("mysql"))
{
tv.setText(item+" Database language");
img.setImageResource(R.drawable.mysql);
}else if(item.equals("access"))
{
tv.setText(item+" Database language");
img.setImageResource(R.drawable.access);
}else if(item.equals("excel"))
{
tv.setText(item+" Microsoft");
img.setImageResource(R.drawable.excel);
}
return row;
}
}
セクション 2 : MainActivity
メインとなるアクティビティです。ListActivityクラスのサブクラスになります。
package com.tutorials.customlistviewarrayadapter;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends ListActivity {
String[] languages={"android","java","c#","mysql","access","excel"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
CustomAdapter adapter=new CustomAdapter(this, languages);
setListAdapter(adapter);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
String item=(String) getListAdapter().getItem(position);
Toast.makeText(getApplicationContext(),"Welcome to "+ item+" Programming language", Toast.LENGTH_SHORT).show();
}
}
セクション 3 : レイアウト
ActivityMain.xml
メインアクティビティのレイアウトです。
<RelativeLayout
android_layout_width="match_parent"
android_layout_height="match_parent"
android_paddingBottom="@dimen/activity_vertical_margin"
android_paddingLeft="@dimen/activity_horizontal_margin"
android_paddingRight="@dimen/activity_horizontal_margin"
android_paddingTop="@dimen/activity_vertical_margin"
tools_context=".MainActivity" >
<ImageView
android_id="@+id/imageView1"
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_layout_alignParentLeft="true"
android_layout_alignParentTop="true"
android_layout_marginLeft="16dp"
android_layout_marginTop="17dp"
android_src="@drawable/ic_launcher" />
<TextView
android_id="@+id/textView1"
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_layout_alignBottom="@+id/imageView1"
android_layout_alignParentRight="true"
android_layout_alignTop="@+id/imageView1"
android_layout_marginLeft="16dp"
android_layout_toRightOf="@+id/imageView1"
android_text="TextView" />
</RelativeLayout>
ごきげんよう。