Android Android 開発クイックスタート

Tian Ge のビデオと一緒に食べるのが良いです: [Tian Ge] Android 開発ビデオチュートリアル最新バージョン Android Studio 開発

UIコンポーネント(コントロール)

レイアウトマネージャー

LinearLayout (リニアレイアウト)

ネスト可能

最も一般的に使用されるプロパティ

id はレイアウトをマークする役割を果たします

layout_width [wrap_content はコンテンツに基づいてサイズを選択し、match_parent は親と一致し、特定の値 (単位 - dp)]

レイアウトの高さ

layout_weight 重み、重みの比率に従って親の残りのスペースを割り当てます。2 つの子要素が水平に配置され、各子要素の幅が 0dp に設定され、重みが 1 に設定されている場合、2 つの子要素は親の幅を均等に分割し、それぞれが半分になります。

背景

レイアウトマージンのマージン

layout_padding パディング

方向は線形レイアウトの方向を設定します

重力は内部要素の位置合わせを設定します

相対レイアウト (相対レイアウト)

layout_toLeftOf は xx の左側に設定されます

layout_toRightOf は xx の右側に設定されます

layout_alignBottom は xx の下部に設定されます

layout_alignParentBottom は、それ自体を親要素の一番下に設定します。

layout_below は xx の下に設定されます

コントロールを使用する手順

  1. MainActivityでコントロールを宣言します(起動ページアクティビティの設定メソッド、対象アクティビティにIntent-filterタグを追加する必要があります)

    <activity android:name=".MainActivity">
    	<intent-filter>
    		<action android:name="android.intent.action.MAIN"/>
    		<category android:name="android.intent.category.LAUNCHER"/
    	</intent-filter>
    </activity>
    

  2. コントロールを見つける

  3. 型変換

  4. クリックイベントを設定する

(

  1. ターゲットアクティビティの作成
  2. このアクティビティを Androidmanifest.xml で宣言します
  3. ターゲットアクティビティでのデザイン

)

private Button mBtn3;//1.在MainActivity里声明控件
@Override
protected void onCreate(Bundle savedInstancestate){
    
    
	super.onCreate(savedInstancestate);
	setContentview(R.layout.activity_button);
	mBtn3 = (Button)findviewById(R.id.btn_3);//2.找到控件 3.类型转换
	mBtn3.setonclickListener(new View.OnclickListener(){
    
    //设置点击事件
		@Override
		public void onclick(View v){
    
    
			Toast.makeText(ButtonActivity.this,"btn3被点击了"Toast.LENGTH_SHORT).show();
});

クリックイベントステップの設定の最適化

  1. View.OnClickListener インターフェイスを実装する OnClick クラスをカスタマイズします。
  2. OnClick クラスの onClick メソッドをオーバーライドします。パラメータは View タイプです。
  3. onClick メソッドは、Intent オブジェクトを宣言し、switch を使用して受信 View オブジェクトの ID を決定する必要があります。異なる ID は、異なる Intent オブジェクトに対応します。
  4. メインクラスで setListeners メソッドを宣言し、その中にカスタム クラス OnClick の新しいオブジェクトを作成し、このオブジェクトを各ボタンの setOnClickListener メソッドに配置します。
  5. Oncreat メソッドで各ボタンのオブジェクトを検索し、最後に setListeners メソッドを 1 回呼び出します。
public class MainActivity extends AppCompatActivity {
    
    

    private Button mBtnUI;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mBtnUI = (Button) findViewById(R.id.btn_ui);
        OnClick onClick = new OnClick();
        mBtnUI.setOnClickListener(onClick);
    }

    class OnClick implements View.OnClickListener{
    
    
        @Override
        public void onClick(View v) {
    
    
            Intent intent = null;
            switch (v.getId()){
    
    
                case R.id.btn_ui:
                    intent = new Intent(MainActivity.this,UIActivity.class);
                    break;
            }
            startActivity(intent);
        }
    }
}

テキストビュー

アプリケーションシナリオ

  1. 文字サイズ、色

ID

layout_width テキスト幅

レイアウトの高さのテキストの高さ

text テキストの内容は、string.xml で定義された文字列を引用符で囲むことをお勧めします。

textColor フォントの色

textSize フォント サイズ (単位 -sp)

  1. …を使用して表示できません

maxLines 最大行数

ellipsize [開始/中間/終了/マーキー/なし] 最後は次で終わります...

  1. 文字+icon

アイコンはドローアブルの下に配置する必要があります

drawableXxxxx = 画像ソース、TextView のテキストの x 側に配置する画像を選択します

drawableRight は、TextView のテキストの右側に配置される画像を選択します

drawablePadding は画像のパディングを選択します

  1. 中心線、下線

Javaコードを介して実装する必要がある

中心線

private Textview mTv4;//声明控件
@Override
protected void onCreate(Bundle savedInstanceState){
    
    
	super.onCreate(savedInstanceState);
	setContentview(R.layout.activity_text_view);
    
	mTv4 = (Textview)findViewById(R.id.tv_4);//找到id对应的控件
	mTv4.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);//设置中划线,此时会有锯齿
	mTv4.getPaint().setAntiAlias(true);//去除锯齿
}

下線

private Textview mTv5;//声明控件
@Override
protected void onCreate(Bundle savedInstanceState){
    
    
	super.onCreate(savedInstancestate);
	setContentview(R.layout.activity_text_view);

    mTv5 = (Textview)findViewById(R.id.tv_5);//指定控件
	mTv5.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);//下划线
}

HTML を通じて下線を設定すると、TextView でテキスト属性の特定の内容を宣言する必要がなくなります。

private TextView mTv6= (TextView) findViewById(R.id.tv_6)
mTv6.setText(Html.fromHtml("<u>李在赣神魔</u>"));
  1. マーキーテキスト効果

singleLine 単一行表示、true に設定

ellipsize は冗長テキストの表示効果を設定します。ここではマーキーに設定する必要があります。

marqueeRepeatLimit テキストサイクルの数。ここでは marquee_forever に設定されます。

これらを設定したら、フォーカス関連の設定も行う必要があります。

focusable を true に設定

focusableInTouchMode は true に設定されます

具体的なコード:

<TextView
	android:id="@+id/tv_7"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	android:text="天哥在奔跑天哥在奔跑天哥在奔跑天哥在奔跑"
	android:textColor="#000000"
	android:textsize="24sp"
	android:singleLine="true"
	android:ellipsize="marquee"
	android:marqueeRepeatLimit="marquee_forever"
	android:focusable="true"
	android:focusableInTouchMode="true"/>

ボタン (TextView のサブクラス)

Button のその他の派生コントロール: ToggleButton、Switch

mainactivity でプライベート ボタンを宣言し、ターゲット ボタン コントロールを指定する必要があります。findViewById() メソッドを通じてビュー オブジェクトを返し、それを Button に強制します。

private Button mBtnTextView =(Button)findViewById(R.id.btn_textview)

ユニークな特性

textAllCaps="false" は、すべての文字の大文字のデフォルト設定をオフにし、実際のテキストに従って表示します。

アプリケーションシナリオ

  1. フォントサイズ

textSize (単位-sp)

  1. カスタム背景形状

背景はカスタム効果を指定します。ドローアブル内にシェイプ ルート要素ファイルを作成する必要があります。

角丸設定ボタン

drawable resource file内容

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">//设置按钮形状为矩形
    <solid android:color="#FF9900"></solid>//设置颜色为橙色
    <corners android:radius="10dp"></corners>//设置圆角

</shape>

境界線を設定し、内側のスペースを塗りつぶします

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">//设置按钮形状为矩形
    <stroke //描边效果
    android:width="1dp" //描边线 的宽度
    android:color="#FF9900"></stroke>//设置颜色为橙色
    <corners android:radius="10dp"></corners>//设置圆角

</shape>
  1. カスタマイズされたプレス効果
<?xml version="1.0"encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
	<item android:state_pressed="true">
		<shape>
			<solid android:color="#AA6600"/>
			<corners android:radius="5dp"/>
		</shape>
	</item>
	<item android:state_pressed="false">
		<shape>
			<solid android:color="#FF9900"/>
			<corners android:radius="5dp"/>
		</shape>
	</item>
</selector>
  1. クリックイベント (携帯電話の下部に灰色のポップアップウィンドウが表示されます)

方法 1:

onClick="showToast" この属性行は、クリック後にアクティビティの showToast() メソッドが呼び出されることを意味します。

このプロパティを Button に設定し、次のコードを模倣して ButtonActivity クラスにメソッドの特定のコンテンツを記述する必要があります。

public class ButtonActivity extends AppCompatActivity{
    
    
	@Override
	protected void onCreate(Bundle savedInstancestate){
    
    
		super.onCreate(savedInstancestate);
		setContentview(R.layout.activity_button);
	}	
	public void showToast(View view){
    
    
		Toast.makeText(this,"我被点击了"Toast.LENGTH_SHORT).show();
    }
}

方法 2: ボタンのクリック イベントを設定する (一般的に使用されます)

アクティビティ内でボタン オブジェクトを宣言し、既存のボタンをポイントします。このオブジェクトの setOnclickListener() を呼び出します。渡されるパラメータは匿名クラスの匿名オブジェクト (new View.OnClickListener()) であり、匿名オブジェクトの onClick() メソッドをオーバーライドします。

private Button mBtn3;
@Override
protected void onCreate(Bundle savedInstancestate){
    
    
	super.onCreate(savedInstancestate);
	setContentview(R.layout.activity_button);
	mBtn3 = (Button)findviewById(R.id.btn_3);
	mBtn3.setonclickListener(new View.OnclickListener(){
    
    
		@Override
		public void onclick(View v){
    
    
			Toast,makeText(ButtonActivity.this,"btn3被点击了"Toast.LENGTH_SHORT).show();
});

TextView ではクリック イベントも設定できます

EditText (TextView のサブクラス)

– 入力テキスト ボックス コントロール

よく使用される (固有の) 属性

textColor テキストの色

ヒント 「ユーザー名を入力してください」などのプロンプトに使用される灰色のテキスト

inputType = “textPassword” は、入力されたパスワードをダーク テキストに設定します

inputType="number" は、入力文字が数字であることを指定し、テキスト ボックスをクリックすると数字キーボードがポップアップします。

drawableLeft は、テキスト ボックスの左側に画像を設定します。

drawablePadding は画像のパディングを設定します

maxLines 最大行数は通常 1 に設定されます。

背景のカスタマイズ方法はボタンのクリックイベントを設定する方法と同じです。

ログイン インターフェイスの作成 + イベントのリッスン (リスニング コントロール)

2 つの edittext ユーザー名とパスワード、およびボタン ログイン ボタン

ログイン成功の効果を得るには、リスニング イベントを設定する必要があります。その手順は、現在のアクティビティで宣言し、コントロールを指定し、クリック効果を設定することです。ボタン アプリケーション シナリオのクリック イベントの 2 番目のメソッドを参照できます。

コンソール上で入力されたユーザー名情報を監視する

private EditText mEtUserName;
mEtUserName = (EditText)findViewById(R.id.et_1);
mEtUserName.addTextChangedListener(new TextWatcher(){
    
    
	@Override
	public void beforeTextChanged(CharSequence s,int start,int count,int 			after){
    
    
		}
	@Override
	public void onTextChanged(CharSequence s,int start,int before,int 			count){
    
    
				Log.d("edittext",s.tostring());//在控制台监听用户输入的信息
		}
	@Override
	public void afterTextChanged(Editable s){
    
    
		}
})

RadioButton(Button子类)

例証します:

  1. 複数の RadioButton グループがある場合は、RadioGroup でラップする必要があります。
  2. RadioGroup はラジオの選択であり、各 RadioButton に背景があっても、その効果は選択されたボタンにのみ表示されます。

よく使用される (固有の) 属性

textSize ボタン テキスト サイズの単位 -sp

チェック済み デフォルトの選択状態 (RadioButton に ID がある場合、それ以外の場合は無効になります)

button="@null" はボタンの円を非表示に設定します

ラジオグループのプロパティ

内部ボタンの配置の向き

カスタムスタイル

ボタンの背景と似ていますが違います↓

セレクターの項目タグの属性

state_checked = "true" ボタンのチェック状態

ストロークタグのストロークエフェクト

イベントをリッスンする

ここに画像の説明を挿入します

チェックボックスチェックボックス

  1. 複数のチェックボックスをラップする必要はありません
  2. 各チェックボックスはオンまたはオフにできます

共通のプロパティ

文章

textSize --sp

テキストの色

button="background_src" カスタム チェックボックス

アイテム属性

state_checked = "true" チェックされた状態は

state_checked = "false" は、選択された状態が

イベントをリッスンする

ここに画像の説明を挿入します

画像ビュー

共通のプロパティ

背景 背景(カラー/画像)

src は背景の上に画像を設定します

scaleType コントロール内のソース画像のスケーリング タイプ (fitXY: コントロールを塗りつぶします。アスペクト比は変更される可能性があります。fitCenter: 完全に表示できるまでアスペクト比のスケーリングを維持します。centerCrop: コントロールを完全に覆うまでアスペクト比を維持し、切り抜きます)。ディスプレイ)

ImageVIew オブジェクトの共通メソッド

setImageResource はピクチャ ビューのピクチャを設定します

ネットワークイメージをロードする方法 (サードパーティのイメージロードライブラリ glide を使用)

重要な注意事項: アプリがネットワーク ファイルを適用する必要がある場合は、AndroidManifest.xml ファイルで use-permission タグを宣言する必要があります。

インポート方法

方法 1: github で glide ライブラリを検索し、ライブラリをダウンロードして libs フォルダーに置きます。

方法 2: または、gradle 管理を使用して、github の readme ファイルに導入されているリポジトリと依存関係を gradle にコピーします。依存関係内の 2 番目のコンパイルをコピーする必要はありません。注: アプリがネットワーク ファイルを適用する必要がある場合、AndroidManifest.xml ファイルで use-permission タグを宣言する必要があります。

単純な使用例
public class ImageViewActivity extends AppCompatActivity {
    
    

    private ImageView mIv4;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_image_view);
        mIv4 = (ImageView) findViewById(R.id.iv_4);//找到控件,mIv4指定控件
        Glide.with(this).load("https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png").into(mIv4);//加载图片,把网络图片地址放在load()里面
    }
}

ListView ListView (時代遅れ、混乱)

カスタムアクティビティ

  1. ListViewActivity を作成します。親クラスは Activity です。AndroidManifest.xmlでカスタムクラスを宣言します。
  2. onCreat()、setContentView メソッド (R.layout.new のlayout.xml) をオーバーライドします。
  3. 新しい XML で、特定の ListView を設計します。

カスタムリストビュー

  1. 最初にアダプターをカスタマイズします
  2. レイアウトを書いて、

共通のプロパティ

listSelector はセレクター変更ファイルを指定します

カスタムアダプターインターフェース

  1. BaseAdapter から継承された、カスタマイズされた MyLIstAdapter。

  2. コンストラクターを作成し、getView メソッド (各グリッドの実装方法をカスタマイズするために使用されます) をオーバーライドします。

    private Context mContext;
    private LayoutInflatert mLayoutInflatert;
    
    public MyListAdapter(Context context){
          
          
    	this.mContext=context;
        mLayoutInflatert=LayoutInflater.from(comtext);
    }
    
    get view()
    

クリックイベント(長押しまたはクリック)

ここに画像の説明を挿入します

GridView (廃止されました。ListView に似ています)

APPCompatActivity と Activity の違い: appcompatactivity は最上位のアプリケーション名を持ちますが、Activity は最上位のアプリケーション名を持ちません。

共通のプロパティ

numColumns は列数を制御します

horizo​​ntalSpacing水平グリッド間隔

verticalSpacing垂直グリッド間隔

アダプターインターフェース

類似性

クリックイベント

類似性

スクロールビュースクロールビュー

垂直スクロール: ScrollView

子要素は 1 つだけ存在できます

LinearLayout を含むコントロールを ScrollView コントロールでラップして垂直スクロールを実現します。

水平スクロール: horizo​​ntalscrollview

子要素は 1 つだけ存在できます

LinearLayout を含むコントロールを horizo​​ntalScrollView コントロールでラップして垂直スクロールを実現します。

RecyclerView コントロール (ジャンプ)

ListView、GridView、ScrollView の置き換えに使用されます

RecyclerViewi は大規模なデータセットを柔軟に表示でき、ListView よりもビューの再利用管理が優れており、リスト、グリッド、ウォーターフォールなどを表示でき、異なる ViewHolder でアイテムの多様な機能を実現できます。
ただし、使用するのが少し面倒で、ListView のような onItemClickListener 的なリッスン イベントがないため、開発者が自分で実装する必要があります。

使用する前に RecyclerView パッケージを導入します。build.gradle の依存関係に追加します。

compile com.android.support:design:25.3.1
//会变换,需要上网搜索查询

LinearRecyclerViewアクティビティ

WebView コントロール

Webページをロードする

URLの読み込み(WebからのHTMLファイル)

webview.loadUrl(“http://www.m.baidu.com”)

読み込まれていない場合は、デフォルトでは js コードが読み込まれていないため、設定する必要があります。

mWv.Main.getSettings().setJavaScriptEnable

ブラウザにジャンプしてアプリケーションでWebページを開かない場合は、設定が必要です。
mWvMain.setWebnViewClient(new MyWebViewClient()); 

class MyWebViewClient extends WebViewClient{
    
    //内部类
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
    
    
            view.loadUrl(request.getUrl().toString());
            return true;
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
    
    
            super.onPageStarted(view, url, favicon);
            Log.d("WebView","onPageStarted...");
        }

        @Override
        public void onPageFinished(WebView view, String url) {
    
    
            super.onPageFinished(view, url);
            Log.d("WebView","onPageFinished...");
//            mWvMain.loadUrl("javascript:alert('hello')");
            mWvMain.evaluateJavascript("javascript:alert('hello')",null);
        }
    }
Web ページに戻るときは、アクティビティを直接終了するようにメソッドを書き直す必要があります。
@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
    
    
        if(keyCode == KeyEvent.KEYCODE_BACK && mWvMain.canGoBack()){
    
    
            mWvMain.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
ローカルのアセットフォルダーをロードします(コンパイルする必要のないファイルをいくつか置きます)

webview.loadUrl(“file:///android_asser/test.html”)

sr0c-mainディレクトリにassetsフォルダーが作成され、ファイルが作成されます。

HTMLコードをロードする

webview.loadData();

webview.loadDataWithBaseURL();

Web ページを前後に進める

webview.canGoBack();

webview.goBack();

webview.canGoForward();

webview.goForward();

webview.canGoVackOrForward(int ステップ)

デフォルトでは、Return キーを押して現在のアクティビティを終了します。VebView のページに戻りたい場合は、
@Override
public boolean onKeyDown(int keyCode,KeyEvent event){
    
    
	if ((keyCode =KeyEvent.KEYCODE_BACK)&&webview.canGoBack()){
    
    
		webview.goBack();
		return true;
		}
        return super.onKeyDown(keyCode,event);
}

UIコンポーネント ポップアップコンポーネント

トースト

トーストは、ボタン クリックのフィードバック プロンプト効果を設計するために使用できるメッセージ プロンプト コンポーネントです。

表示位置を設定する

デフォルト、中央揃え、画像付き (カスタマイズ)

カスタム クラス OnClick を作成して View.OnClickListener を実装する

class OnClick implements View.OnClickListener{
    
    
        @Override
        public void onClick(View v) {
    
    
            switch (v.getId()){
    
    
                case R.id.btn_toast_1://默认效果
                    Toast.makeText(getApplicationContext(),"Toast",Toast.LENGTH_LONG).show();
                    break;
                case R.id.btn_toast_2://居中效果,makeText返回的是一个Toast类型对象,对这个对象进行操作可以改变Toast调用show()时显示的样式
                    Toast toastCenter = Toast.makeText(getApplicationContext(),"居中Toast",Toast.LENGTH_LONG);
                    toastCenter.setGravity(Gravity.CENTER,0,0);
                    toastCenter.show();
                    break;
                case R.id.btn_toast_3://自定义图片效果
                    Toast toastCustom = new Toast(getApplicationContext());
                    LayoutInflater inflater = LayoutInflater.from(ToastActivity.this);
                    View view = inflater.inflate(R.layout.layout_toast,null);
                    ImageView imageView = (ImageView) view.findViewById(R.id.iv_toast);
                    TextView textView = (TextView) view.findViewById(R.id.tv_toast);
                    imageView.setImageResource(R.drawable.icon_smile);
                    textView.setText("自定义Toast");
                    toastCustom.setView(view);
                    toastCustom.setDuration(Toast.LENGTH_LONG);
                    toastCustom.show();
                    break;
                case R.id.btn_toast_4:
                    ToastUtil.showMsg(getApplicationContext(),"包装过的Toast");
                    break;
            }
        }
    }

表示内容をカスタマイズする

Toast オブジェクトを通じて表示コンテンツをカスタマイズする

case R.id.btn_toast_3:
                    Toast toastCustom = new Toast(getApplicationContext());
                    LayoutInflater inflater = LayoutInflater.from(ToastActivity.this);
                    View view = inflater.inflate(R.layout.layout_toast,null);
                    ImageView imageView = (ImageView) view.findViewById(R.id.iv_toast);
                    TextView textView = (TextView) view.findViewById(R.id.tv_toast);
                    imageView.setImageResource(R.drawable.icon_smile);
                    textView.setText("自定义Toast");
                    toastCustom.setView(view);
                    toastCustom.setDuration(Toast.LENGTH_LONG);
                    toastCustom.show();
                    break;

Toast オブジェクトの一般的なメソッド/コンストラクター

コンストラクターは以下を使用します。

トーストトーストカスタム = new Toast(getApplicationContext());

方法:

setView(view) はトーストのビューを設定します

setDuration はトーストの滞在時間を設定します

show はトーストの内容を表示します

cancel トーストを複数回クリックしても、エフェクトは 1 回だけスーパーインポーズされます (API の上位バージョンではこれを考慮する必要はありません)。

例証します:

setView メソッドはビューを渡す必要があります。ビューは、LayoutInflater オブジェクトを通じて inflate メソッドを呼び出すことによって返される必要があります。さらに、imageView を指定し、imageView を通じてメソッドを呼び出すことで、これらのコントロールの表示コンテンツをカスタマイズすることもできます。

シンプルなカプセル化、パブリック ユーティリティ クラス ToastUtil

public class ToastUtil {
    
    
    public static Toast mToast;
    public static void showMsg(Context context,String msg){
    
    
        if(mToast == null){
    
    
            mToast = Toast.makeText(context,msg,Toast.LENGTH_LONG);
        }else{
    
    
            mToast.setText(msg);
        }
        mToast.show();
    }
}

ToastUtil を使用すると、cnacel メソッドが使用されない場合でも、この場合エフェクトは 1 回だけスーパーインポーズされます。

case R.id.btn_toast_4:
                    ToastUtil.showMsg(getApplicationContext(),"包装过的Toast");
                    break;

AlertDialog アラート ダイアログ ボックス

AlertDialog.Builder の共通メソッド

setTitle はダイアログのタイトルを設定します

setMessage はダイアログ ボックスの内容を設定します

setIcon はダイアログ アイコンを設定します

setPositiveButton はポジティブ オプション ボタンを設定します (onClick はボタンのクリック イベントを設定します)

setNeutralButton はニュートラル ボタンを設定します

setNegativeButton はマイナスボタンを設定します

setItems パラメータは配列にすることができ、ボタンのコンテンツを設定し、クリック イベントを設定できます。

setSingleChoiceItems は、単一の選択 (配列、選択されるコンテンツの配列インデックス、クリック イベント) を設定します。

setCancelable(false) 設定 - オプションをクリックするだけでなく、他の場所をクリックしてもダイアログ ボックスは消えません。これを設定した後、show メソッドを呼び出した後に onClick で dismiss を呼び出して、クリック後に消える効果を実現する必要があります。オプション。

デフォルトのスタイル

ステップ:

case R.id.btn_dialog1:
                    AlertDialog.Builder builder = new AlertDialog.Builder(DialogActivity.this);
//链式调用,设置对话框显示效果,以及点击事件
                    builder.setTitle("请回答").setMessage("你觉得课程如何?")
                            .setIcon(R.drawable.icon_user)
                            .setPositiveButton("棒", new DialogInterface.OnClickListener() {
    
    
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
    
    
                                    ToastUtil.showMsg(DialogActivity.this, "你很诚实");
                                }
                            }).setNeutralButton("还行", new DialogInterface.OnClickListener() {
    
    
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
    
    
                            ToastUtil.showMsg(DialogActivity.this, "你再瞅瞅~");
                        }
                    }).setNegativeButton("不好", new DialogInterface.OnClickListener() {
    
    
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
    
    
                            ToastUtil.showMsg(DialogActivity.this, "睁眼说瞎话");
                        }
                    }).show();
                    break;

ラジオスタイル

setSingleChoiceItems()

スタイル 1:

case R.id.btn_dialog2:
                    final String[] array2 = new String[]{
    
    "男", "女"};
                    AlertDialog.Builder builder2 = new AlertDialog.Builder(DialogActivity.this);
                    builder2.setTitle("选择性别").setItems(array2, new DialogInterface.OnClickListener() {
    
    
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
    
    
                            ToastUtil.showMsg(DialogActivity.this, array2[which]);
                        }
                    }).show();
                    break;

スタイル 2: デフォルトで値を選択できます

case R.id.btn_dialog3:
                    final String[] array3 = new String[]{
    
    "男", "女"};
                    AlertDialog.Builder builder3 = new AlertDialog.Builder(DialogActivity.this);
                    builder3.setTitle("选择性别").setSingleChoiceItems(array3, 1, new DialogInterface.OnClickListener() {
    
    
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
    
    
                            ToastUtil.showMsg(DialogActivity.this, array3[which]);
                            dialog.dismiss();
                        }
                    }).setCancelable(false).show();
                    break;

複数選択スタイル

setMultiChoiceItems()

case R.id.btn_dialog4:
                    final String[] array4 = new String[]{
    
    "唱歌", "跳舞","写代码"};
                    boolean[] isSelected = new boolean[]{
    
    false,false,true};
                    AlertDialog.Builder builder4 = new AlertDialog.Builder(DialogActivity.this);
                    builder4.setTitle("选择兴趣").setMultiChoiceItems(array4, isSelected, new DialogInterface.OnMultiChoiceClickListener() {
    
    
                        @Override
                        public void onClick(DialogInterface dialog, int which, boolean isChecked) {
    
    
                            ToastUtil.showMsg(DialogActivity.this,array4[which]+":"+isChecked);
                        }
                    }).setPositiveButton("确定", new DialogInterface.OnClickListener() {
    
    
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
    
    
                            //
                        }
                    }).setNegativeButton("取消", new DialogInterface.OnClickListener() {
    
    
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
    
    

                        }
                    }).show();
                    break;

カスタムスタイル(ログインスタイル)

case R.id.btn_dialog5:
                    AlertDialog.Builder builder5 = new AlertDialog.Builder(DialogActivity.this);
                    View view = LayoutInflater.from(DialogActivity.this).inflate(R.layout.layout_dialog,null);
                    EditText etUserName = (EditText) view.findViewById(R.id.et_username);
                    EditText etPassWord = (EditText) view.findViewById(R.id.et_password);
                    Button btnLogin = (Button) view.findViewById(R.id.btn_login);
                    btnLogin.setOnClickListener(new View.OnClickListener() {
    
    
                        @Override
                        public void onClick(View v) {
    
    
                            //
                        }
                    });
                    builder5.setTitle("请先登录").setView(view).show();
                    break;

プログレスバー&プログレスダイアログ

プログレスバー

共通のプロパティ

style プログレスバーのスタイル。デフォルトは @style/Widget.material.ProgressBar です。多くのスタイルがあります。res-values-style でスタイルをカスタマイズできます。

    <style name="MyProgressBar">
        <item name="android:indeterminateDrawable">@drawable/bg_progress</item>//引用一个自定义的drawable文件
    </style>

このうち、widget.progressbar.horizo​​ntal は進行状況を示す長いプログレスバーです。

progress は、プログレスバーの進行状況を設定します。

SecondaryProgress は、進行状況バーの 2 番目の進行状況を設定します。

progressDrawable プログレスバーのカスタムビューをデザインします。

可視性は進行状況バーを表示するか非表示にするかを制御します

indeterminateDrawable="@drawable/bg_progress" カスタム ドローアブル ファイルに置き換えます (

<?xml version="1.0" encoding="utf-8"?>
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/icon_progress"//一个图片
    android:pivotX="50%" //设置水平转轴中心
    android:pivotY="50%">//设置垂直

</animated-rotate>

進行状況ダイアログ

ここに画像の説明を挿入します

ProgressDialog クラスの共通メソッド

コンストラクタ:

ProgressDialog progressDialog = new ProgressDialog(ProgressActivity.this);

方法:

setProgressStyle は、進行状況バーに設定できるスタイルを設定します。

setTitle はタイトルを設定します

setMessage セット内容

setOnCancelListener はキャンセル動作のリスナーを設定します

setCancelable="false" 設定をキャンセルできません

show 進行状況ダイアログを表示

setButton セットボタン

例1

ここに画像の説明を挿入します

private Button mBtnStart,mBtnProgressDialog1,mBtnProgressDialog2;
mBtnProgressDialog1 = (Button) findViewById(R.id.btn_progress_dialog1);
mBtnProgressDialog1.setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View v) {
    
    
                ProgressDialog progressDialog = new ProgressDialog(ProgressActivity.this);
                progressDialog.setTitle("提示");
                progressDialog.setMessage("正在加载");
                progressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
    
    
                    @Override
                    public void onCancel(DialogInterface dialog) {
    
    
                        ToastUtil.showMsg(ProgressActivity.this,"cancel...");
                    }
                });
                progressDialog.setCancelable(false);
                progressDialog.show();
            }
        });
例 2

ここに画像の説明を挿入します

     mBtnProgressDialog2.setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View v) {
    
    
                ProgressDialog progressDialog = new ProgressDialog(ProgressActivity.this);
                progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                progressDialog.setTitle("提示");
                progressDialog.setMessage("正在下载...");
                progressDialog.setButton(DialogInterface.BUTTON_POSITIVE, "棒", new DialogInterface.OnClickListener() {
    
    //设置按钮
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
    
    
                        //
                    }
                });
                progressDialog.show();
            }
        });

カスタムダイアログ(?)

ダイアログの形状を設定(シェイプ)

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">//矩形
    <solid android:color="@color/colorWhite"/>//填充颜色
    <corners android:radius="10dp"/>//圆角
</shape>

CustomDialogActivityページ

public class CustomDialogActivity extends AppCompatActivity {
    
    

    private Button mBtnDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_custom);
        mBtnDialog = (Button) findViewById(R.id.btn_custom_dialog);
        mBtnDialog.setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View v) {
    
    
                CustomDialog customDialog = new CustomDialog(CustomDialogActivity.this);
                customDialog.setTitle("提示").setMessage("确认删除此项?")
                .setCancel("取消", new CustomDialog.IOnCancelListener() {
    
    
                    @Override
                    public void onCancel(CustomDialog dialog) {
    
    
                        ToastUtil.showMsg(CustomDialogActivity.this,"cancel...");
                    }
                }).setConfirm("确认", new CustomDialog.IOnConfirmListener() {
    
    
                    @Override
                    public void onConfirm(CustomDialog dialog) {
    
    
                        ToastUtil.showMsg(CustomDialogActivity.this,"confirm...");
                    }
                }).show();
            }
        });
    }
}

カスタム CustomDialog クラス

public class CustomDialog extends Dialog implements View.OnClickListener{
    
    

    private TextView mTvTitle,mTvMessage,mTvCancel,mTvConfirm;

    private String title,message,cancel,confirm;

    private IOnCancelListener cancelListener;

    private IOnConfirmListener confirmListener;

    public CustomDialog(@NonNull Context context) {
    
    
        super(context);
    }

    public CustomDialog(@NonNull Context context,int themeId) {
    
    
        super(context,themeId);
    }

    public CustomDialog setTitle(String title) {
    
    
        this.title = title;
        return this;
    }

    public CustomDialog setMessage(String message) {
    
    
        this.message = message;
        return this;
    }

    public CustomDialog setCancel(String cancel,IOnCancelListener listener) {
    
    
        this.cancel = cancel;
        this.cancelListener = listener;
        return this;
    }

    public CustomDialog setConfirm(String confirm,IOnConfirmListener listener) {
    
    
        this.confirm = confirm;
        this.confirmListener = listener;
        return this;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_custom_dialog);
        //设置宽度
        WindowManager m = getWindow().getWindowManager();
        Display d = m.getDefaultDisplay();
        WindowManager.LayoutParams p = getWindow().getAttributes();
        Point size = new Point();
        d.getSize(size);
        p.width = (int)(size.x * 0.8); //设置dialog的宽度为当前手机屏幕的宽度*0.8
        getWindow().setAttributes(p);

        mTvTitle = (TextView) findViewById(R.id.tv_title);
        mTvMessage = (TextView) findViewById(R.id.tv_message);
        mTvCancel = (TextView) findViewById(R.id.tv_cancel);
        mTvConfirm = (TextView) findViewById(R.id.tv_confirm);
        if(!TextUtils.isEmpty(title)){
    
    
            mTvTitle.setText(title);
        }
        if(!TextUtils.isEmpty(message)){
    
    
            mTvMessage.setText(message);
        }
        if(!TextUtils.isEmpty(cancel)){
    
    
            mTvCancel.setText(cancel);
        }
        if(!TextUtils.isEmpty(confirm)){
    
    
            mTvConfirm.setText(confirm);
        }
        mTvCancel.setOnClickListener(this);
        mTvConfirm.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
    
    
        switch (v.getId()){
    
    
            case R.id.tv_cancel:
                if(cancelListener != null){
    
    
                    cancelListener.onCancel(this);
                }
                dismiss();
                break;
            case R.id.tv_confirm:
                if(confirmListener != null){
    
    
                    confirmListener.onConfirm(this);
                }
                dismiss();
                break;
        }
    }

    public interface IOnCancelListener{
    
    
        void onCancel(CustomDialog dialog);
    }

    public interface IOnConfirmListener{
    
    
        void onConfirm(CustomDialog dialog);
    }
}

PopupWindow ポップアップウィンドウ

被写体選択機能で利用可能

ここに画像の説明を挿入します

一般的な方法

setOutsideTouchable = "true" 外側をクリックしてポップアップ ウィンドウを閉じるように設定します

setFocusable =“true”

showAsDropDown は、ウィンドウが表示されるコントロールを設定します。

showAtLocation

アクティビティファイル:

public class PopupWindowActivity extends AppCompatActivity {
    
    

    private Button mBtnPop;
    private PopupWindow mPop;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_popup_window);
        mBtnPop = (Button) findViewById(R.id.btn_pop);
        mBtnPop.setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View v) {
    
    
                View view = getLayoutInflater().inflate(R.layout.layout_pop,null);
                TextView textView = (TextView) view.findViewById(R.id.tv_good);
                textView.setOnClickListener(new View.OnClickListener() {
    
    
                    @Override
                    public void onClick(View v) {
    
    
                        mPop.dismiss();
                        //do something...
                        ToastUtil.showMsg(PopupWindowActivity.this,"好");
                    }
                });
                mPop = new PopupWindow(view,mBtnPop.getWidth(), ViewGroup.LayoutParams.WRAP_CONTENT);
                mPop.setOutsideTouchable(true);
                mPop.setFocusable(true);
                mPop.showAsDropDown(mBtnPop);
            }
        });
    }
}

ページデザインxmlファイル

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@drawable/bg_dropdown">

    <TextView
        android:id="@+id/tv_good"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:textColor="@color/colorGrayDark"
        android:text="好"
        android:gravity="center"
        android:paddingTop="8dp"
        android:paddingBottom="8dp"/>

    <View
        android:layout_width="match_parent"
        android:layout_height="0.5dp"
        android:background="@color/colorGrayDark"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:textColor="@color/colorGrayDark"
        android:text="还行"
        android:gravity="center"
        android:paddingTop="8dp"
        android:paddingBottom="8dp"/>

    <View
        android:layout_width="match_parent"
        android:layout_height="0.5dp"
        android:background="@color/colorGrayDark"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:textColor="@color/colorGrayDark"
        android:text="不好"
        android:gravity="center"
        android:paddingTop="8dp"
        android:paddingBottom="8dp"/>

</LinearLayout>

不可欠な活動と断片

アクティビティ作成三部作

ステップ:

1. Activity またはそのサブクラスを継承する新しいクラスを作成します (v7.appcompatactivity)

2. AndroidManifestで宣言します。ページのタイトルを変更したい場合は、ここで activity タグに label 属性を設定する必要があります。

3. レイアウトを作成し、アクティビティのonCreatに設定します。

Activity属性

screenOrientation 表示方向、固定垂直または固定垂直、デフォルトは携帯電話の変更に従う

ラベルタイトル

テーマ 主題

launchMode 起動モード

インテントフィルタータグは起動ページに設定されます。

taskAffinity=".abcdef" はタスク スタックの名前を設定します

<intent-filter>
	<action android:name="android.intent..action.MAIN"/
	<category android:name="android.intent.category.LAUNCHER"/
</intent-filter>

ページのタイトルバーをカスタマイズする方法

  1. activity 属性の theme = [noactionbar は効果がありません] を設定します。各ページに同じテーマを設定したい場合は、application タグでテーマの効果 = noactionbar を設定できます。

アクティビティのライフサイクル

ここに画像の説明を挿入します

現在のアクティビティがどのような状態にあるかを確認する方法 (コンソールを介した情報の出力)

public class LifeCycleActivity extends AppCompatActivity {
    
    
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        Log.d("LifeCycle","----onCreate----");
    }

    @Override
    protected void onStart() {
    
    
        super.onStart();
        Log.d("LifeCycle","----onStart----");
    }

    @Override
    protected void onResume() {
    
    
        super.onResume();
        Log.d("LifeCycle","----onResume----");
    }

    @Override
    protected void onPause() {
    
    
        super.onPause();
        Log.d("LifeCycle","----onPause----");

    }

    @Override
    protected void onStop() {
    
    
        super.onStop();
        Log.d("LifeCycle","----onStop----");
    }

    @Override
    protected void onRestart() {
    
    
        super.onRestart();
        Log.d("LifeCycle","----onRestart----");
    }

    @Override
    protected void onDestroy() {
    
    
        super.onDestroy();
        Log.d("LifeCycle","----onDestroy----");
    }
}
  • 初めてアクティビティに入ると、oncreat onstart onresume と進みます。
  • 他の場所が占有されているため、アクティビティがバックグラウンドで実行されます。
  • アクティビティを閉じるときの onDestory

アクティビティジャンプとデータ転送

明示的ジャンプと暗黙的ジャンプ

通常は1を表示する方法を使用します。

暗黙的に他のソフトウェアにジャンプできますか? ソフトウェアページから通話ページにジャンプしますか?

mBtnJump.setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View v) {
    
    
                //显式1
                Intent intent = new Intent(AActivity.this, BActivity.class);
                Bundle bundle = new Bundle();
                bundle.putString("name", "天哥");
                bundle.putInt("number", 88);
                intent.putExtras(bundle);
                startActivity(intent);
//                startActivityForResult(intent, 0);

                //显式2
//                Intent intent = new Intent();
//                intent.setClass(AActivity.this,BActivity.class);
//                startActivity(intent);

                //显式3
//                Intent intent = new Intent();
//                intent.setClassName(AActivity.this,"com.skypan.helloworld.jump.BActivity");
//                startActivity(intent);

                //显式4
//                Intent intent = new Intent();
//                intent.setComponent(new ComponentName(AActivity.this,"com.skypan.helloworld.jump.BActivity"));
//                startActivity(intent);

                //隐式
//                Intent intent = new Intent();
//                intent.setAction("com.skypan.test.BActivity");
                //setAction的内容是我们再AndroidManifest中给这个Activity设置的action,可以是任何值,起标识作用;然后设置category为default,具体看下面
//                startActivity(intent);
            }
        });
<activity android:name=".jump.BActivity"
	android:label="B">
	<intent-filter>
		<action android:name="com.skypan.test.BActivity"/>
		<category android:name="android.intent.category.DEFAULT"/>
	</intent-filter>
</activity>

アクティビティ間のデータ転送

//传出:intent:意图
Intent intent = new Intent(AActivity.this, BActivity.class);
                Bundle bundle = new Bundle();
                bundle.putString("name", "天哥");
                bundle.putInt("number", 88);
                intent.putExtras(bundle);
                startActivity(intent);
//接收:
Bundle bundle = getIntent().getExtras();
        String name = bundle.getString("name");
        int number = bundle.getInt("number");

startActivity: アクティビティを開始し、完了後に結果を返します。

ページ A がページ B に移動します。ページ B がページ A にデータを転送する必要がある場合、startActivityForResult(intent,0); を使用する必要があります。

//A页面
startActivityForResult(intent, 0);  

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    
    
        super.onActivityResult(requestCode, resultCode, data);
        Toast.makeText(AActivity.this, data.getExtras().getString("title"), Toast.LENGTH_LONG).show();
    }
//B页面
  mBtnFinish.setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View v) {
    
    
                Intent intent = new Intent();
                Bundle bundle1 = new Bundle();
                bundle1.putString("title","我回来了");
                intent.putExtras(bundle1);
                setResult(Activity.RESULT_OK,intent);
                finish();
            }
        });

アクティビティを開始する 4 つの方法

アクティビティの android:launchMode 属性 (AndroidManifest で設定):

  • 標準:標準モード
  • singleTop: タスクスタックトップ再利用モード
  • singleTask: タスクスタック内の再利用モード
  • singleInstance: グローバル シングルトン モード

標準

アクティビティはタスクスタックで管理され、アクティビティが開始されるたびにスタックに入れられ、リターンキーを押すとスタックの先頭からアクティビティが削除されます。

standard はデフォルトの起動モード、つまり標準モードです。アクティビティが開始されるたびに、新しいインスタンスが作成されます。

シングルトップ

開始対象のアクティビティがすでにスタックの最上位にある場合、新しいインスタンスは作成されず、スタックの最上位にあるアクティビティが再利用され、その onNewIntent() メソッドが呼び出されます。スタックの最上位にない場合は、標準の
.instance と同じように新しいインスタンスが作成されます。

シングルタスク

同じタスクスタック内で、開始対象のアクティビティがすでにスタック内にある場合、そのアクティビティは再利用され、その onNewIntent() メソッドが呼び出され、そのアクティビティの上にあるアクティビティ y
はクリアされます。スタックを作成してから、新しいインスタンスを作成します。

単一インスタンス

グローバル再利用は、どのタスクスタックであっても、対象のアクティビティが存在する限り再利用されます。各アクティビティは新しいタスク スタックを占有します。

断片

  • フラグメントには独自のライフサイクルがあります
  • フラグメントはアクティビティに依存します
  • Fragmenti は getActivity() を通じてそのアクティビティを取得でき、Activityi は FragmentManager の findFragmentById() または findFragmentByTag() を通じてフラグメントを取得できます。
  • フラグメントとアクティビティには多対多の関係があります

flagment.java は、フレームレイアウトをターゲットとするコントロール内に追加する必要があります

一般的な属性メソッド

getActivity() は、アクティビティが存在する場所を取得します。

onAttach() は、フラグメントが配置されているアクティビティに関連付けられるようにフラグメントを設定します。

onDetach セットのフラグメント

使用手順

  1. フラグメント カスタム .java ファイルを作成し、フラグメントから継承し、対応する XML ファイルを作成し、フラグメント フラグメント設計を実行します。

  2. 2 つのメソッドをオーバーライドします。

    public class BFragment extends Fragment {
          
          
    
        private TextView mTvTitle;
    
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
          
          
            View view = inflater.inflate(R.layout.fragment_b,container,false);
            return view;
        }
    
        @Override
        public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
          
          
            super.onViewCreated(view, savedInstanceState);
            //
            mTvTitle = (TextView) view.findViewById(R.id.tv_title);//之后可以对textview进行操作
        }
    
    }
    
  3. 使用するアクティビティ内でフラグメントを宣言し、このカスタム フラグメントcustom.javaのインスタンスをポイントして、そのフラグメントをアクティビティに追加します。

    public class ContainerActivity extends AppCompatActivity implements AFragment.IOnMessageClick{
          
          
    
        private AFragment aFragment;
        private TextView mTvTitle;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
          
          
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_container);
            mTvTitle = (TextView) findViewById(R.id.tv_title);
    
            //实例化AFragment
            aFragment = AFragment.newInstance("我是参数");
            //把AFragment添加到Activity中,记得调用commit
            getFragmentManager().beginTransaction().add(R.id.fl_container,aFragment,"a").commitAllowingStateLoss();
        }
    
        public void setData(String text){
          
          
            mTvTitle.setText(text);
        }
    
        @Override
        public void onClick(String text) {
          
          
            mTvTitle.setText(text);
        }
    }
    

位置フラグメントを bfragment に置き換える方法

クリック イベントを通じてフラグメント変換を実装する場合は、onClick メソッドで新しいフラグメントを作成してから、getFragmentManager().beginTransaction().replace(R.id.fl_container,bFragment).commitAllowingStateLoss();

ここに画像の説明を挿入します

Fragment内のgetActivity()がnullになる場合がある問題

  1. あまり推奨されない方法は、フラグメント内でアクティビティを宣言し、onAttach() メソッドをオーバーライドすることによって、メソッド内でこのアクティビティを指定し、getActivity() メソッドが発生する場所で代わりにこの宣言されたアクティビティを使用する方法です。

    private Activity mActivity;
    @Override
    public void onAttach(Context context){
          
          
    	super.onAttach(context);
    	mActivity=(Activity) context;
    }
    
  2. このメソッドは、フラグメントをリサイクルする際に onDestory() が呼び出されるが、その際、 getActivity() が null になる事態を避けるために、onDestory() メソッド内で非同期タスクをキャンセルするためである。

フラグメントにパラメータを渡す

  1. パラメーターの受け渡し: Afragment に静的メソッドを作成します。この静的メソッドにより、返された Afragment が元の Fragment と同じパラメーターを持つようになり、パラメーターの設定によって Fragment がリセットされるのを回避できます。そして、パラメータを送信できるAfragmentを取得する際に、クラスメソッドのnewInstance()メソッドを呼び出してFragmentを返します。

        
    public static AFragment newInstance(String title){
          
          
            AFragment fragment = new AFragment();
            Bundle bundle = new Bundle();
            bundle.putString("title",title);
            fragment.setArguments(bundle);
            return fragment;
        }
    
    private AFragment aFragment=AFragment.newInstance("我是参数");
    
  2. パラメータを受信します。

    @Override
    public void onViewCreated(Viewview,@Nullable Bundle savedInstancestate){
          
          
    	super.onViewCreated(view,savedInstancestate);
    	//
    	mTvTitle (Textview)view.findviewById(R.id.tv_title);
    	if(getArguments()!null){
          
          
    	mTvTitle.setText(getArguments().getstring("title"));
        }
    }
    

フラグメントバックスタック

getFragmentManager().beginTransaction().replace(R.id.fL_container,bFragment).addToVackStack(null).commitAllowingstateLoss(); //添加到回退栈,在replace生效之后,按返回键会返回到replace之前的Activity,而不是回到mainactivity

この時点で Afragment に戻ると、インスタンスは同じインスタンスのままですが、onCreatView が再度呼び出され、ビューが再構築されます。ただし、元のフラグメントへの変更が戻ったときにリセットされないことを願っています。

このとき、前のコンポジションを非表示にしてから、新しいビューを追加する必要があります。

mBtnChange.setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View v) {
    
    
                if(bFragment == null){
    
    
                    bFragment = new BFragment();
                }
                Fragment fragment = getFragmentManager().findFragmentByTag("a");
                if(fragment != null){
    
    
                   						 getFragmentManager().beginTransaction().hide(fragment).add(R.id.fl_container,bFragment).addToBackStack(null).commitAllowingStateLoss();//若存在目标fragment,先hide,再add
                }else{
    
    
                    getFragmentManager().beginTransaction().replace(R.id.fl_container,bFragment).addToBackStack(null).commitAllowingStateLoss();//如果存在Fragment,直接replace会重置fragment视图,这是不符合预期的
                }
            }
        });

フラグメントとアクティビティ間の通信

フラグメントは、アクティビティのコントロール プロパティを設定します。

方法 1 (非推奨): アクティビティでメソッドを宣言します。このメソッドは、アクティビティのコントロールのプロパティを設定できます。フラグメントでメソッドを呼び出すと、アクティビティのプロパティを変更できます。

方法 2:

  1. Fragment で IOnMessageClick インターフェイスを宣言します。インターフェイスには抽象メソッドがあり、仮パラメータを渡します。
  2. アクティビティがこのフラグメントにこのインターフェイスを実装し、抽象メソッドを実装する必要があるようにします。
  3. フラグメントの onAttach メソッドで、宣言された IOnMessageClick インターフェイスの値を onAttach の仮パラメータ コンテキストに割り当てます。

断片内

private IOnMessageClick listener;
public interface IOnMessageClick{
    
    
        void onClick(String text);
    }
    @Override
    public void onAttach(Context context) {
    
    
        super.onAttach(context);
        try {
    
    
            listener = (IOnMessageClick) context;
        }catch (ClassCastException e){
    
    
            throw new ClassCastException("Activity 必须实现 IOnMessageClick接口");
        }
    }

  mBtnMessage.setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View v) {
    
    
//                ((ContainerActivity)getActivity()).setData("你好");
                listener.onClick("你好");
            }
        });

深く理解する必要がある Android イベント処理

リスニングベースのイベント処理メカニズム

モニタリングの3要素

イベントソースボタン

イベントonClick

イベント リスナー onclicklistener

イベントをリッスンするメソッドを実装する

  • 内部クラスを通じて実装される
  • 匿名の内部クラス経由
  • イベントソースが配置されているクラスを通じて実装されます。
  • 外部クラスを通じて実装
  • レイアウト ファイル内の onClick (クリック イベント用)
    ここに画像の説明を挿入します

方法 5: レイアウト ファイル内の onClick (クリック イベントの場合)

コントロールで onClick 属性を宣言します。属性の値はカスタマイズできますが、この属性と同じ値を持つメソッドがアクティビティ内に存在する必要があります。

たとえば、値が表示されている場合、

public void show(View v){
    
    
	switch (v.getId()){
    
    
		case R.id.btn_event:
			ToastUtil.showMsg(EventActivity.this,"click...");
			break;
    }
}

同じタイプの複数のリスナーを同じイベント ソースに追加するとどうなりますか?

システムは最後に設定されたリスナーに応答し、以前に設定されたリスナーは無効になります。

レイアウト ファイル内の onClick によって設定されたリスナーは、最初のリスナー セットとみなされます。

コールバックベースのイベント処理メカニズム (ジャンプ)

コールバックメカニズムとモニタリングメカニズムの違いは何ですか?

コールバック メカニズムのイベント ソースとイベント リスナーは結合されており、リスニング メカニズムは 3 つに分離されています。

コールバックベースのイベント伝播

ソースコード解析、View(ジャンプ)のイベント分布の理解

ハンドラーメッセージの処理


将来何かを行うために、将来のある時点としてメッセージとランナブルが実行されるようにスケジュールするには?


自分のスレッド間通信とは別のスレッドで実行されるアクションをキューに入れる

一般的な方法

コンストラクター: Dandler()

方法:

postDelayed (スレッド、ミリ秒) 遅延する時間

public class HandlerActivity extends AppCompatActivity{
    
    
	private Handler mHandler;
	@override
	protected void onCreate(Bundle savedInstanceState){
    
    
		super.onCreate(savedInstancestate);
		setContentview(R.layout.activity_handler);
		mHandler = new Handler();
		mHandler.postDelayed(new Runnable(){
    
    
			@Override
			public void run(){
    
    
			Intent intent = new Intent(HandlerActivity.this,ButtonActivity.class);
			startActivity(intent);
            }
},3686);
    }
}

handleMessage (メッセージ) メッセージの送信

private Handler mHandler;

mHandler = new Handler(){
    
    
	@Override
	public void handleMessage(Message msg){
    
    //接收信息
		super.handleMessage(msg);
		switch (msg.what){
    
    
		case 1:
			ToastUti1.showMsg(HandlerActivity.this,"线程通信成功")break;
		}
    };
    new Thread(){
    
    //发送信息
		@Override
		public void run(){
    
    
			super.run();
			Message  message = new Message();
			message.what=1;
			mHandler.sendMessage(message);
        }
	}.start();
}

データストレージ

共有優先の軽量データ ストレージ

xml ファイル、キーと値のペアを保存する

2 つのキー:

共有設定

SharedPreferences.Editor

private SharedPreferences mSharedPreferences;
private SharedPreferences.Editor mEditor;
mSharedPreferences= getsharedPreferences("data",MODE_PRIVATE);//获取对象的方法,第二个形参为模式,一般选择private,不让别的软件读/写
mEditor = mSharedPreferences.edit();

//点击事件里:存储数据
	mEditor.putString("name",mEtName.getText().toString());
	mEditor.apply();//这一步是储存数据,apply可以异步储存数据,commit同步储存数据,一般用apply
//点击事件里:获取数据
	mTvContent.setText(mSharedPreferences.getString("name",""));//getString()+SharedPreferences文件里的"键",比如存储的name

このファイルは /data/data//shared_prefs に保存されます。デフォルトでは、このファイルはシステム インターフェイスから開くことはできませんが、通常はキー値をプログラムから直接取得します。

Android ストレージの概念

ここに画像の説明を挿入します

内部ストレージとは端末に付属しているストレージのことを指し、外部ストレージとはSDカードなどを指します。

内部ストレージディレクトリ:

/data/data//shared_prefs
/data/
data//databases
/data/data//files /data/data//cache

context.getCacheDir() および context.getFileDir() を通じてファイルのコンテンツを取得します。

外部ストレージディレクトリ:

パブリックディレクトリ(SDカード):
Environment.getExternalStoragePublicDirectory(int型)
プライベートディレクトリ:
/mnt/sdcard/Android/data/data//cache
/mnt/sdcard/Android/data/data//files

ファイル内部ストレージ (Android システムの内蔵ストレージ)

上書きされたストレージです

2 つのメソッド save() と read() をカスタマイズしてデータの保存と読み取りを行い、onClick で 2 つのメソッドを呼び出して保存と読み取りを実装します。

ストアデータsave()

//存储数据
private void save(String content){
    
    
	Fileoutputstream fileOutputstream null;
	try{
    
    
		fileOutputstream 		openFileOutput(mFileName,MODE_PRIVATE);
		fileoutputstream.write(content.getBytes());
	}
	catch (IOException e){
    
    
		e.printstackTrace();
    }
	finally{
    
    
		if(fileoutputstream !null){
    
    
			try{
    
    
				fileoutputstream.close();
            }
        } catch (IOException e){
    
    
			e.printstackTrace();
        }
    }
}

データの読み取り read()

//读取数据
private String read(){
    
    
	FileInputstream fileInputstream = null;
	try{
    
    
		fileInputstream openFileInput(mFileName);
		byte[]buff new byte[1024];
		StringBuilder sb new StringBuilder("");
		int len =0;
		while ((len fileInputstream.read(buff))>e){
    
    
			sb.append(new String(buff,0,len));
			}
	return sb.toString();
	} catch (IOException e){
    
    
		e.printstackTrace();
	} finally{
    
    
		if(fileInputstream !null){
    
    
			try{
    
    
				fileInputstream.close();
			} catch (IOException e){
    
    
				e.printstackTrace();
			}
		}
    }
	return null;
}

メソッドの適用

mBtnSave.setonclickListener(new View.OnclickListener(){
    
    
	@override
	public void onclick(View v){
    
    
		save(mEtName.getText().toString());
	});
mBtnShow.setonclickListener(new View.OnclickListener(){
    
    
	@override
	public void onclick(View v){
    
    
		mTvContent.setText(read());
	});

ファイル外部ストレージ (SD カードへの読み取りおよび書き込み)

上書きされたストレージです

方法は内部ストレージと同様で、SDカードのパブリックディレクトリに保存するには許可が必要で、AndroidManifestに以下のように記述する方法です。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    //还有一种,加不加都行
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>    

ストレージ権限を取得するには、mainactivity の oncreate() に次のように記述する必要もあります。

ActivityCompat.requestPermissions(this,new String[]{
    
    Manifest.permission.WRITE_EXTERNAL_STORAGE},1);

保存()

//存储数据
private void save(String content){
    
    
	FileOutputstream fileOutputstream null;
	try{
    
    
//leoutputstream openFiLeoutput(mFtLeName,MODE_PRIVATE);
	File dir=new File(Environment.getExternalFilesDir(null),"skypan");//文件会保存在android/data/appID/file下面
	if(!dir.exists()){
    
    //如果目录不存在就new一个
		dir.mkdirs();
    }
	File file = new File(dir,mFileName);//查找一个文件,第二个参数是文件名
	if(!file.exist()){
    
    //如果不存在,创建一个
		file.createNewFile();
	}
	fileOutputstream new=FileOutputstream(file);
	fileOutputStream.write(content.getBytes());
    }catch (IOException e){
    
    
	e.printstackTrace();
	finally{
    
    	
		if(fileOutputStream !null){
    
    
            try{
    
    
				fileOutputstream.close();
            }
        }catch (IOException e){
    
    
			e.printstackTrace();
        }
    }
    }
}

読む()

//读取数据
private String read(){
    
    
	FileInputstream fileInputstream = null;
	try{
    
    
		//fileInputstream = openFileInput(mFileName);
        File file new= new File(Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"skypan",mFiname);//file.separator是斜杠/
        fileInputstream= new FileInputStream(file);
		byte[]buff new byte[1024];
		StringBuilder sb new StringBuilder("");
		int len =0;
		while ((len fileInputstream.read(buff))>e){
    
    
			sb.append(new String(buff,0,len));
			}
	return sb.toString();
	} catch (IOException e){
    
    
		e.printstackTrace();
	} finally{
    
    
		if(fileInputstream !null){
    
    
			try{
    
    
				fileInputstream.close();
			} catch (IOException e){
    
    
				e.printstackTrace();
			}
		}
    }
	return null;
}

放送

LocalBroadcastManager()

これはアプリケーション内でのみ伝播され、システム内には伝播されません。

ブロードキャストを使用して 2 つのアクティビティ間のコミュニケーションを実現する

ただし、次の例では、通常 startActivityForResult() が使用されます。前述したように、ページをクリックした後に値をコールバックできます。

  1. MyBroadcast クラスをカスタマイズし、BroadcastReveiver から継承する
  2. ブロードキャストの受信: 受信を書き換え、2 つのパラメーター (コンテキスト、インテント) を渡し、インテントのアクションが何であるかを決定し、そのアクションを通じて何を行うかを決定します。
  3. ブロードキャストを送信する: 必要に応じて MyBroadcast をインスタンス化し、次にインテントフィルターをインスタンス化し、tentfilter.addAction("アクション名") を呼び出してからブロードキャストを登録し、LocalBroadcastManager の getInstance(this).registerReceiver(MyBroadcast object,tentfilter object ) を呼び出します。

ブロードキャストを受信するためのカスタム クラス:

private class MyBroadcast extends BroadcastReceiver{
    
    
	@Override
	public void onReceive(Contextcontext,Intent intent){
    
    
		switch (intent.getAction()){
    
    
			case "com.skypan.update":
				mTVTest.setText("123");
				break;	
        }
    }
}

特定のアプリケーション:

mBroadcast new = MyBroadcast();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.skypan.update");//添加要做哪些动作
LocalBroadcastManager.getInstance(this).registerReceiver(mBroadcast,intentFilter);//注册一个广播

最後に、アクティビティを閉じるときに、onDestory メソッドでブロードキャストをオフにする必要があります。

@Override
protected void onDestroy(){
    
    
	super.onDestroy();
	LocalBroadcastManager.getInstance(this).unregisterReceiver(mBroadcast);
}

プロパティアニメーション

トゥイーンアニメーションとプロパティアニメーションについて

トゥイーン アニメーションでは一部のアニメーションのみが表示されますが、そのプロパティは変更されておらず、アニメーションを印刷する xy 軸は元の位置のままです。プロパティ アニメーションとは、プロパティが変化し、その結果、いくつかのアニメーションが発生することを意味します。

よく使用される 2 つの属性アニメーション:

値アニメーター

ステップ:

  1. コントロールの宣言、コントロールの指定

  2. コントロールの animate() メソッドを呼び出してから、さまざまなアニメーション効果を呼び出します。

  3. オフセット効果:

    tvText.anmate().translationYBy(500).setDutation(2000).start();//translationYBy延y轴偏移500,setDutation设置动作执行的时间(ms),start执行效果
    
  4. グラデーション効果:

    tvTest.animate().alpha(0).setDuration(2000).start();//两秒内亮度渐变为0
    
  5. その他の実装方法:

    1. VaLueAnimator vaLueAnimator = VaLueAnimator.ofInt(0,100);//让数值从0变到100
      vaLueAnimator.setDuration(2000);//设置变化时间
      vaLueAnimator.addUpdateListener(new VaLueAnimator.AnimatorUpdateListener(){
              
              //设置监听器,监听数值变化
      @override
      public void onAnimationUpdate(ValueAnimator animation){
              
              
      	//vaLueAnimator实际的值
      	Log.d("aaaa",animation.getAnimatedvalue()+"");//在控制台打印信息
      	//动画的进度0-1
      	Log.d("aaaa",animation.getAnimatedFraction()+"");
      });
      vaLueAnimator.start();//开启监听器
      

ObjectAnimator.ofFloat()

利用可能な操作:translationX / TanslationY / alpha /回転/回転X...

説明書

ObjectAnimator objectAnimator = ObjectAnimator.ofFLoat(tvTest,"translationY",0,500);//让tvTest进行translationY操作,从0偏移到500,后边也可以传更多数值参数表示从0到500再到其他地方
objectAnimator.setDuration(2000);//设置动画时间
objectAnimator.start();//开启动画
//也可以设置update监听器监视具体信息

おすすめ

転載: blog.csdn.net/m0_63323097/article/details/124511567