blob: b4d1635d1caa9e677b68dd31cf189781c60fa62c [file] [log] [blame]
page.title=S kin Nhp liu
parent.title=Giao din Người dùng
parent.link=index.html
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Trong tài liu này</h2>
<ol>
<li><a href="#EventListeners">Đối tượng theo dõi S kin</a></li>
<li><a href="#EventHandlers">B x lý S kin</a></li>
<li><a href="#TouchMode">Chế độ Cm ng</a></li>
<li><a href="#HandlingFocus">X lý Tiêu đim</a></li>
</ol>
</div>
</div>
<p>Trên Android, có nhiu cách để can thip vào các s kin t tương tác ca mt người dùng vi ng dng ca bn.
Khi xem xét các s kin trong giao din người dùng ca bn, cách tiếp cn là chp li s kin t
đối tượng Dng xem c th mà người dùng tương tác vi. Lp Dng xem s cung cp phương thc để làm vic này.</p>
<p>Trong các lp Dng xem khác nhau mà bn s s dng để son b trí ca mình, bn có th thy mt vài phương pháp gi li
công khai dường như hu ích đối vi s kin UI. Nhng phương pháp này được khuôn kh Android gi khi
xy ra hành động tương ng trên đối tượng đó. Ví dụ, khi mt Dng xem (chng hn như mt Nút) được chm vào,
phương pháp <code>onTouchEvent()</code> được gi trên đối tượng đó. Tuy nhiên, để can thip vào điu này, bn phi m rng
lp và khng chế phương pháp đó. Tuy nhiên, vic m rng mi đối tượng Dng xem
để x lý mt s kin như vy s là không thc tế. Đây là lý do ti sao lp Dng xem cũng cha
mt tp hp giao din lng nhau cùng các phương pháp gi li mà bn có th định nghĩa d dàng hơn nhiu. Nhng giao din này,
được gi là <a href="#EventListeners">đối tượng theo dõi s kin</a>, là tấm vé để bạn chụp lại tương tác giữa người dùng với UI của bạn.</p>
<p>Trong khi các đối tượng theo dõi s kin s thường được s dng để theo dõi tương tác ca người dùng, có th
có lúc bn mun m rng mt lp Dng xem để xây dng mt thành phn tùy chnh.
Có th là bn mun m rng lp {@link android.widget.Button}
để khiến cái gì đó trông n tượng hơn. Trong trường hp này, bn s có th định nghĩa các hành vi s kin mc định cho lp
ca mình bng cách s dng <a href="#EventHandlers">b x lý s kin</a> của lớp.</p>
<h2 id="EventListeners">Đối tượng theo dõi S kin</h2>
<p>Đối tượng theo dõi s kin là mt giao din trong lp {@link android.view.View} cha mt phương pháp gi li
đơn lẻ. Nhng phương pháp này s được khuôn kh Android gi khi Dng xem mà đối tượng theo dõi đã
được đăng ký vi b kích khi bi tương tác gia người dùng vi mc trong UI.</p>
<p>Trong giao din ca đối tượng theo dõi s kin là nhng phương pháp gi li sau:</p>
<dl>
<dt><code>onClick()</code></dt>
<dd>T {@link android.view.View.OnClickListener}.
Phương pháp này được gi khi người dùng chm vào mc
(khi chế độ cm ng), hoc ly tiêu đim vào mt mc bng phím điu hướng hoc bi xoay và
nhn phím "enter" phù hp hoc nhn bi xoay.</dd>
<dt><code>onLongClick()</code></dt>
<dd>T {@link android.view.View.OnLongClickListener}.
Phương pháp này được gi khi người gi chm và gi mc (khi chế độ cm ng), hoc
ly tiêu đim vào mt mc bng phím điu hướng hoc bi xoay và
nhn và gi phím "enter" phù hp hoc nhn và gi bi xoay (trong mt giây).</dd>
<dt><code>onFocusChange()</code></dt>
<dd>T {@link android.view.View.OnFocusChangeListener}.
Phương pháp này được gi khi người dùng điu hướng lên hoc ra khi mt mc bng cách s dng các phím điu hướng hoc bi xoay.</dd>
<dt><code>onKey()</code></dt>
<dd>T {@link android.view.View.OnKeyListener}.
Phương pháp này được gi khi người dùng được ly tiêu đim vào mt mc và nhn hoc nh phím cng trên thiết bị.</dd>
<dt><code>onTouch()</code></dt>
<dd>T {@link android.view.View.OnTouchListener}.
Phương pháp này được gi khi người dùng thc hin mt hành động được coi như mt s kin chm, bao gm nhn, nhả,
hoc bt k động tác chuyn động nào trên màn hình (trong đường biên ca mc đó).</dd>
<dt><code>onCreateContextMenu()</code></dt>
<dd>T {@link android.view.View.OnCreateContextMenuListener}.
Phương pháp này được gi khi mt Menu Ng cnh đang được xây dng (kết qu ca mt s kin "nhấp giữ" kéo dài). Xem phn tho lun v
menu ng cnh trong hướng dn dành cho nhà phát trin <a href="{@docRoot}guide/topics/ui/menus.html#context-menu">Menu</a>
.</dd>
</dl>
<p>Nhng phương pháp này là phương pháp duy nht nm trong giao din tương ng ca chúng. Để định nghĩa mt trong nhng phương pháp này
và x lý s kin ca bn, hãy trin khai giao din lng nhau trong Hot động ca bn hoc định nghĩa nó thành mt lp vô danh.
Sau đó, chuyn mt thc th trin khai ca bn
ti phương pháp <code>View.set...Listener()</code> tương ng. (Ví dụ, gi
<code>{@link android.view.View#setOnClickListener(View.OnClickListener) setOnClickListener()}</code>
và chuyn cho nó trin khai {@link android.view.View.OnClickListener OnClickListener} ca bn.)</p>
<p>Ví d bên dưới cho biết cách đăng ký mt đối tượng theo dõi khi nhp cho mt Nút. </p>
<pre>
// Create an anonymous implementation of OnClickListener
private OnClickListener mCorkyListener = new OnClickListener() {
public void onClick(View v) {
// do something when the button is clicked
}
};
protected void onCreate(Bundle savedValues) {
...
// Capture our button from layout
Button button = (Button)findViewById(R.id.corky);
// Register the onClick listener with the implementation above
button.setOnClickListener(mCorkyListener);
...
}
</pre>
<p>Bn cũng có th thy tin hơn khi trin khai OnClickListener như mt phn trong Hot động ca mình.
Làm vy s tránh phi ti lp b sung và phân b đối tượng. Ví dụ:</p>
<pre>
public class ExampleActivity extends Activity implements OnClickListener {
protected void onCreate(Bundle savedValues) {
...
Button button = (Button)findViewById(R.id.corky);
button.setOnClickListener(this);
}
// Implement the OnClickListener callback
public void onClick(View v) {
// do something when the button is clicked
}
...
}
</pre>
<p>Lưu ý rng phương pháp gi li <code>onClick()</code> trong ví d trên không có giá tr
tr về, nhưng mt s phương pháp đối tượng theo dõi s kin khác phi tr v mt boolean. Lý do
này ph thuc vào s kin. Vi s ít s kin thc hin như vy, sau đây là lý do:</p>
<ul>
<li><code>{@link android.view.View.OnLongClickListener#onLongClick(View) onLongClick()}</code> -
Tr v mt boolean cho biết bn đã x lý s kin và s kin không nên được tiếp tc hay không.
C thể, tr v <em>true</em> để cho biết rng bn đã x lý s kin và nó nên dng đây;
tr v <em>false</em> nếu bạn chưa xử lý nó và/hoc s kin s tiếp tc đối vi bt k
đối tượng theo dõi khi nhp nào khác.</li>
<li><code>{@link android.view.View.OnKeyListener#onKey(View,int,KeyEvent) onKey()}</code> -
Tr v mt boolean cho biết bn đã x lý s kin và s kin không nên được tiếp tc hay không.
C thể, tr v <em>true</em> s cho biết rng bn đã x lý s kin và nó nên dng đây;
tr v <em>false</em> nếu bạn chưa xử lý nó và/hoc s kin s tiếp tc đối vi bt k
đối tượng theo dõi trên phím nào khác.</li>
<li><code>{@link android.view.View.OnTouchListener#onTouch(View,MotionEvent) onTouch()}</code> -
Tr v mt boolean cho biết đối tượng theo dõi ca bn có x lý s kin này hay không. Điu quan trng đó là
s kin này có th có nhiu hành động ni tiếp nhau. Vì vy, nếu bn tr v <em>false</em> khi
nhn được s kin hành động hướng xung, bn s cho biết rng mình chưa x lý s kin và cũng
không quan tâm ti các hành động sau đó t s kin này. Vì thế, bn s không b gi vì bt k hành động nào khác
trong s kin, chng hn như mt c ch ngón tay, hay s kin hành động cho s kin hướng lên.</li>
</ul>
<p>Ghi nh rng các s kin phím cng luôn được chuyn ti Dng xem đang được ly tiêu đim. Chúng được chuyn bt đầu t trên cùng
ca phân cp Dng xem, ri xung dưới, ti khi chúng đến đích phù hp. Nếu Dng xem ca bn (hoc con ca Dng xem)
hin có tiêu đim, khi đó bn có th thy hành trình ca s kin qua phương pháp <code>{@link android.view.View#dispatchKeyEvent(KeyEvent)
dispatchKeyEvent()}</code>. Mt cách khác để chp li các s kin phím bm thông qua Dng xem ca mình, bn cũng có th nhn
tt c s kin bên trong Hot động ca mình bng <code>{@link android.app.Activity#onKeyDown(int,KeyEvent) onKeyDown()}</code>
và <code>{@link android.app.Activity#onKeyUp(int,KeyEvent) onKeyUp()}</code>.</p>
<p>Đồng thi, khi nghĩ ti nhp liu văn bn cho ng dng ca bn, hãy nh rng nhiu thiết b ch có các phương pháp
nhp liu mm. Nhng phương pháp như vy không bt buc phi da trên phím bm; mt s có th s dng nhp liu bng ging nói, viết tay, v.v. Ngay c khi
mt phương pháp nhp liu trình bày mt giao din như bàn phím, nó s thường <strong>không</strong> kích khi h s kin
<code>{@link android.app.Activity#onKeyDown(int,KeyEvent) onKeyDown()}</code>. Bạn không nên
xây dng UI yêu cu kim soát các thao tác nhn phím c th tr khi mun gii hn ng dng ca bn mt s thiết b
có bàn phím cng. C thể, không được da vào nhng phương pháp này để xác thc nhp liu khi người dùng nhn phím
quay li; thay vào đó, hãy s dng các hành động như {@link android.view.inputmethod.EditorInfo#IME_ACTION_DONE} để báo hiệu với
phương pháp nhp liu bn k vng ng dng ca mình s phn ng như thế nào để nó có th thay đổi UI ca mình cho có nghĩa. Tránh các gi định
v cách thc hot động ca mt phương pháp nhp liu mm và ch tin tưởng để nó cung cp văn bn đã có định dng cho ng dng ca mình.</p>
<p class="note"><strong>Lưu ý:</strong> Android s gi b x lý s kin trước ri mi ti b x lý
mc định phù hp t định nghĩa lp. Như thế, vic tr v <em>true</em> t nhng đối tượng theo dõi s kin này s dng
vic lan truyn s kin ti đối tượng theo dõi s kin khác và cũng s chn phương pháp gi li ti
b x lý s kin mc định trong Dng xem. Vì thế, hãy chc chn rng bn mun chm dt s kin khi tr v <em>true</em>.</p>
<h2 id="EventHandlers">B x lý S kin</h2>
<p>Nếu bn đang xây dng mt thành phn tùy chnh t Dng xem, khi đó bn s có th định nghĩa mt vài phương pháp gi li
được s dng như b x lý s kin mc định.
Trong tài liu v <a href="{@docRoot}guide/topics/ui/custom-components.html">Thành phn
Tùy chnh</a>, bn s tìm hiu v mt s phương pháp gi li ph biến được s dng để x lý s kin,
bao gm:</p>
<ul>
<li><code>{@link android.view.View#onKeyDown}</code> - Được gọi khi xảy ra một sự kiện phím bấm mới.</li>
<li><code>{@link android.view.View#onKeyUp}</code> - Được gọi khi xảy ra một sự kiện phím bấm hướng lên.</li>
<li><code>{@link android.view.View#onTrackballEvent}</code> - Được gọi khi xảy ra một sự kiện chuyển động bi xoay.</li>
<li><code>{@link android.view.View#onTouchEvent}</code> - Được gọi khi xảy ra một sự kiện chuyển động màn hình cảm ứng.</li>
<li><code>{@link android.view.View#onFocusChanged}</code> - Được gọi khi dạng xem có hoặc mất tiêu điểm.</li>
</ul>
<p>Có mt s phương pháp khác mà bn cn lưu ý, chúng không thuc lp Dng xem,
nhưng có th tác động trc tiếp ti cách bn có th x lý s kin. Vì thế, khi qun lý các s kin phc tp hơn bên trong
mt b trí, hãy xét nhng phương pháp khác sau:</p>
<ul>
<li><code>{@link android.app.Activity#dispatchTouchEvent(MotionEvent)
Activity.dispatchTouchEvent(MotionEvent)}</code> - Phương pháp này cho phép {@link
android.app.Activity} ca bn can thip vào tt c s kin chm trước khi chúng được phân phi ti ca sổ.</li>
<li><code>{@link android.view.ViewGroup#onInterceptTouchEvent(MotionEvent)
ViewGroup.onInterceptTouchEvent(MotionEvent)}</code> - Phương pháp này cho phép mt {@link
android.view.ViewGroup} xem s kin khi chúng được phân phi ti Dng xem con.</li>
<li><code>{@link android.view.ViewParent#requestDisallowInterceptTouchEvent(boolean)
ViewParent.requestDisallowInterceptTouchEvent(boolean)}</code> - Gi phương pháp
này trên Dng xem m để cho biết rng nó s không can thip vào các s kin chm bng <code>{@link
android.view.ViewGroup#onInterceptTouchEvent(MotionEvent)}</code>.</li>
</ul>
<h2 id="TouchMode">Chế độ Cm ng</h2>
<p>
Khi mt người dùng đang điu hướng trong mt giao din người dùng bng phím hướng hoc bi xoay, cn
ly tiêu đim ti các mc có th hành động (như nút) sao cho người dùng có th thy
mc nào s chp nhn nhp liu. Tuy nhiên, nếu thiết b có kh năng cm ng, và người dùng
bt đầu tương tác vi giao din bng cách chm vào nó, khi đó không còn cn
tô sáng mc hay ly tiêu đim ti mt Dng xem c th na. Do đó, có mt chế độ cho
tương tác có tên là "chế độ cảm ứng."
</p>
<p>
Đối vi thiết b có kh năng cm ng, sau khi người dùng chm vào màn hình, thiết b
s vào chế độ cm ng. T đim này tr đi, ch nhng Dng xem mà
{@link android.view.View#isFocusableInTouchMode} là đúng mới có thể lấy tiêu điểm, chẳng hạn như chế độ xem các widget chỉnh sửa văn bản.
Các Dng xem chm được, chng hn như nút, s không ly được tiêu đim khi chm; chúng s ch đơn gin
khi chy đối tượng theo dõi khi nhp ca mình khi được nhn.
</p>
<p>
Bt c khi nào mt người dùng nhn phím hướng hoc cun bng bi xoay, thiết b s
thoát chế độ cm ng, và tìm mt dng xem để ly tiêu đim. Lúc này, người dùng có th tiếp tc tương tác
vi giao din người dùng mà không chm vào màn hình.
</p>
<p>
Trng thái chế độ cm ng s được duy trì trên toàn b h thng (tt c ca s và hot động).
Để truy vn trng thái hin ti, bn có th gi
{@link android.view.View#isInTouchMode} để xem liệu thiết bị có đang ở trong chế độ cảm ứng hay không.
</p>
<h2 id="HandlingFocus">X lý Tiêu đim</h2>
<p>Khuôn kh s x lý chuyn động ca tiêu đim thường xuyên hi đáp li nhp liu ca người dùng.
Vic này bao gm thay đổi tiêu đim khi Dng xem b loi b hoc n đi, hoc khi Dng xem
mi có sn. Dng xem th hin s sn sàng ly tiêu đim ca chúng
thông qua phương pháp <code>{@link android.view.View#isFocusable()}</code>. Để thay đổi việc liệu một Dạng xem có thể lấy
tiêu đim hay không, hãy gi <code>{@link android.view.View#setFocusable(boolean) setFocusable()}</code>. Khi ở trong chế độ cảm ứng,
bn có th truy vn xem Dng xem có cho phép ly tiêu đim bng <code>{@link android.view.View#isFocusableInTouchMode()}</code> hay không.
Bn có th thay đổi điu này bng <code>{@link android.view.View#setFocusableInTouchMode(boolean) setFocusableInTouchMode()}</code>.
</p>
<p>Chuyn động tiêu đim được da trên mt gii thut tìm kiếm đối tượng gn nht theo
mt hướng cho trước. Trong các trường hp hiếm gp, gii thut mc định có th không khp vi
hành vi theo ý định ca nhà phát trin. Trong nhng tình hung này, bn có th cung cp
các khng chế rõ ràng vi các thuc tính XML sau trong tp b trí:
<var>nextFocusDown</var>, <var>nextFocusLeft</var>, <var>nextFocusRight</var>, và
<var>nextFocusUp</var>. Thêm một trong những thuộc tính này vào Dạng xem mà <em>từ</em> đó
tiêu đim đang ri khi. Định nghĩa giá tr ca thuc tính là id ca Dng xem
<em>mà</em> cần được lấy tiêu điểm. Ví dụ:</p>
<pre>
&lt;LinearLayout
android:orientation="vertical"
... >
&lt;Button android:id="@+id/top"
android:nextFocusUp="@+id/bottom"
... />
&lt;Button android:id="@+id/bottom"
android:nextFocusDown="@+id/top"
... />
&lt;/LinearLayout>
</pre>
<p>Thông thưởng, trong b trí thng đứng này, vic điu hướng lên t Nút đầu tiên s không
đi ti đâu hết và vic điu hướng xung t Nút th hai cũng vy. Gi thì khi Nút trên cùng
đã định nghĩa Nút dưới cùng là <var>nextFocusUp</var> (và ngược li), tiêu đim điu hướng s
luân chuyn t trên-xung-dưới và dưới-lên-trên.</p>
<p>Nếu bn mun khai báo mt Dng xem là có th ly tiêu đim trong UI ca mình (thông thường thì không),
hãy thêm thuc tính XML <code>android:focusable</code> vào Dng xem, trong khai báo b trí ca bn.
Đặt giá tr <var>true</var>. Bn cũng có th khai báo mt Dng xem
là có th ly tiêu đim trong khi Chế độ Cm ng bng <code>android:focusableInTouchMode</code>.</p>
<p>Để yêu cu mt Dng xem c th để ly tiêu đim, hãy gi <code>{@link android.view.View#requestFocus()}</code>.</p>
<p>Để theo dõi các s kin tiêu đim (được thông báo khi mt Dng xem nhn được hoc mt tiêu đim), hãy s dng
<code>{@link android.view.View.OnFocusChangeListener#onFocusChange(View,boolean) onFocusChange()}</code>,
như được đề cp trong phn <a href="#EventListeners">Đối tượng theo dõi S kin</a> bên trên.</p>
<!--
<h2 is="EventCycle">Event Cycle</h2>
<p>The basic cycle of a View is as follows:</p>
<ol>
<li>An event comes in and is dispatched to the appropriate View. The View
handles the event and notifies any listeners.</li>
<li>If, in the course of processing the event, the View's bounds may need
to be changed, the View will call {@link android.view.View#requestLayout()}.</li>
<li>Similarly, if in the course of processing the event the View's appearance
may need to be changed, the View will call {@link android.view.View#invalidate()}.</li>
<li>If either {@link android.view.View#requestLayout()} or {@link android.view.View#invalidate()} were called,
the framework will take care of measuring, laying out, and drawing the tree
as appropriate.</li>
</ol>
<p class="note"><strong>Note:</strong> The entire View tree is single threaded. You must always be on
the UI thread when calling any method on any View.
If you are doing work on other threads and want to update the state of a View
from that thread, you should use a {@link android.os.Handler}.
</p>
-->