実用的なButton特効:進捗バーをクリックし、プログラムをロードしてからButtonに戻る

6295 ワード

最近、博聴網を開発しているウェブサイトクライアント.博聴网は1つのコミュニティのウェブサイトで、中にはネットユーザーが送った贴り付けがあって、私のクライアントは最初は15条しか表示していないで、最下層にButtonボタンがあって、もっと多く命名して、ユーザーがもっと多くのボタンをクリックする时、クライアントはもとの基础の上で更に15篇の招待状をロードします.また、ロード中にこのButtonが回転プログレスバーになり、プログラムがデータをロードし、インタフェースが偽死したときに再びクリックしてプログラムが閉じることを防止します.データが受信されると、進捗バーはbuttonに戻ります.
 
効果を見てみましょう.
 
初期状態:
 
クリック効果:
 
クリックするとさらに15個表示されます.
 
 
まず、その大まかな実現の考え方をお話しします.
1.まず、インタフェースにButtonとProgressBarを定義し、ProgressBarは初期に非表示に設定されます.
2.この2つのコントロールを1つのレイアウトに配置し、リストの最後にレイアウトを追加します.
3.buttonがProgressBarになることを通知する2つのブロードキャストと、データのロードが完了した後に進捗バーをButtonに変更する2つのブロードキャストを定義します.
4.Buttonにメッセージ応答関数を設定します.ここでは先ほど定義したブロードキャストを使用します.
 
 
コード(注:完全なソースコードには他の操作がたくさんあるので、ここではサブbuttonと有効なコードセグメントだけを貼ります):
 
ButtonとProgressBarを定義し、2つのブロードキャストイベントButtonBroadCastとBackBroadcastのオブジェクト、およびいくつかのレイアウトパラメータを指定します.
 
 
private Button more=null;
private ProgressBar bar =null;
private ButtonBroadcast buttonchange=null;
private BackBroadcast buttonback=null;

 
 private LayoutParams FFlayoutParams =new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.FILL_PARENT);

private  LayoutParams mLayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);

private LayoutParams BLayoutParams =new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
 
 
onCreate()で次の操作を行います.
 
 
 more=new Button(this);
 more.setText(" ");
 more.setGravity(Gravity.CENTER);

bar=new ProgressBar(this);
bar.setVisibility(View.GONE);
bar.setMax(5);
bar.setMinimumHeight(5);
bar.setMinimumWidth(5);

lin.addView(more,FFlayoutParams);
        lin.addView(bar, BLayoutParams);
        lin.setGravity(Gravity.CENTER);
        
        LinearLayout loadingLayout = new LinearLayout(this);
        loadingLayout.addView(lin,mLayoutParams);
        loadingLayout.setGravity(Gravity.CENTER);
        
        hotlist=(ListView)findViewById(R.id.list);
        hotlist.addFooterView(loadingLayout);


 
 
注意:ここのButtonとProgressBarはmainにいません.xmlでは定義され、javaコードで生成されます.ListViewというコントロールの特殊性のためです.listviewはレイアウトファイルに存在すると、画面全体を上書きし、他のコントロールが定義されても表示されません.listviewにデータを追加して、その下に他のコントロールを定義して、それらのコントロールが表示されているかどうかを見てみましょう.2つ目は、RelativeLayoutでレイアウトする場合、buttonはlistviewの下に置くことができますが、listのドラッグに伴って移動しません.つまり、listがどうであれ、いつも一番下にあるので、私たちの設計と一致しません.だから、listのaddFooterView()メソッドを採用しました.そうすれば、buttonはlistの最後の方法と存在します.コード内のhotlistはインタフェースlistオブジェクトです.
 
 
 
 
次に、2つのブロードキャスト処理のコードを示します.
 
 
private class ButtonBroadcast extends BroadcastReceiver{

		@Override
		public void onReceive(Context context, Intent intent) {
			// TODO Auto-generated method stub
			String action=intent.getAction();
			
			if(action.equals(ButtonAction))
			{			
				more.setVisibility(View.GONE);
				bar.setVisibility(View.VISIBLE);
			}   		
		}
	}
	
	private class BackBroadcast extends BroadcastReceiver{

		@Override
		public void onReceive(Context context, Intent intent) {
			// TODO Auto-generated method stub
			String action=intent.getAction();
			
			if(action.equals(BarAction))
			{ 
				bar.setVisibility(View.GONE);
				more.setVisibility(View.VISIBLE);   
			}		
		}
	}

放送の動作がButtonactionであればbuttonは消え,barは現れ,動作がBarActionであれば逆である.
 
次はbuttonのクリックイベントです.
 
 
 more.setOnClickListener(new OnClickListener()
        {
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				buttonchange=new ButtonBroadcast();
				buttonback=new BackBroadcast();
				filter1=new IntentFilter();
				filter2=new IntentFilter();
				
				filter1.addAction(ButtonAction);
				filter2.addAction(BarAction);

				intent1=new Intent();
				intent2=new Intent();
				intent1.setAction(ButtonAction);
				intent2.setAction(BarAction);
				
				new Thread(new Runnable()
				{
					public void run()
					{
						showmore();
						handler.post(new Runnable()
						{
							public void run()
							{
								listadapter.notifyDataSetChanged();
								
								HTTPRequestActivity.this.registerReceiver(buttonback, filter2);
								HTTPRequestActivity.this.sendBroadcast(intent2);
								HTTPRequestActivity.this.unregisterReceiver(buttonback);
							}
						});
					}
				}).start();
				
				HTTPRequestActivity.this.registerReceiver(buttonchange, filter1);
				HTTPRequestActivity.this.sendBroadcast(intent1);
				HTTPRequestActivity.this.unregisterReceiver(buttonchange);
			}
        }
        );

 
2つの異なるactionをフィルタする2つのIntentFilterクラスオブジェクトが関数に定義されています.2つのintentオブジェクトを同時に定義して動作を伝達します.showmore()関数呼び出し後のデータはローカルにロードされており、この関数の実装を管理する必要はなく、handlerのpostメソッドでインタフェースを更新し、buttonを消失させるブロードキャストを送信し、これらが実行されたらbuttonに戻るブロードキャストを送信します.ここで新しいスレッドを用いたのは,ダウンロードデータがインタフェースと1つのスレッドに変化すればbutton効果も現れないためであり,スレッドがブロックされているためである.
 
コード内のButtonActionとBarActionは、次のように定義されます.
 
 
private static final String ButtonAction="com.suns.HTTPRequestActivity.BUTTONCHANGE";
	private static final String BarAction="com.suns.HTTPRequestActivity.BARCHANGE";
 
ここではintentfliterフィルタ用に2つのactionをカスタマイズし、一般的なネーミング方法はパッケージ名+"."+aciton名.
 
ここまで来て私达の実现する机能はButtonをクリックして进度条を変えて、プログラムのロードが终わった后に戻る効果は実现して、ありがとうございます
 
ps:このいいサイト、博聴網をお勧めします.
中の招待状の内容は豊富でとても面白くて、ネットユーザーの素質もとても高くて、比較的に人情味のあるコミュニティで、みんなが見に行くことをお勧めします.
 
博聴网网网址:www.bling0.com