티스토리 뷰
Stack Overflow에 자주 검색, 등록되는 문제들과 제가 개발 중 찾아 본 문제들 중에서 나중에도 찾아 볼 것 같은 문제들을 정리하고 있습니다.
Stack Overflow에서 가장 먼저 확인하게 되는 가장 높은 점수를 받은 Solution과 현 시점에 도움이 될 수 있는 가장 최근에 업데이트(최소 점수 확보)된 Solution을 각각 정리하였습니다.
아래 word cloud를 통해 이번 포스팅의 주요 키워드를 미리 확인하세요.
How to handle button clicks using the XML onClick within Fragments
XML onClick를 사용하여 Fragment에서 버튼 클릭을 처리하는 방법
문제 내용
Pre-Honeycomb (Android 3), each Activity was registered to handle button clicks via the onClick
tag in a Layout's XML:
Android 3 버전 이전에는 각 액티비티가 레이아웃 XML의 onClick 태그를 통해 버튼 클릭을 처리하도록 등록되었습니다.
android:onClick="myClickMethod"
Within that method you can use view.getId()
and a switch statement to do the button logic.
해당 메서드 내에서 view.getId()와 switch 문을 사용하여 버튼 로직을 수행할 수 있습니다.
With the introduction of Honeycomb I'm breaking these Activities into Fragments which can be reused inside many different Activities. Most of the behavior of the buttons is Activity independent, and I would like the code to reside inside the Fragments file without using the old (pre 1.6) method of registering the OnClickListener
for each button.
Honeycomb부터는 Activity를 Fragment로 나누어서 여러 다른 Activity에서 재사용할 수 있게 되었습니다. 버튼의 대부분 동작은 Activity에 독립적이며, 예전(1.6 이전) 방식인 각 버튼에 대해 OnClickListener를 등록하는 방법을 사용하지 않고 Fragments 파일 내에서 코드가 존재하도록 하고 싶습니다.
final Button button = (Button) findViewById(R.id.button_id);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Perform action on click
}
});
The problem is that when my layout's are inflated it is still the hosting Activity that is receiving the button clicks, not the individual Fragments. Is there a good approach to either
문제는 레이아웃이 인플레이트될 때 버튼 클릭 이벤트가 개별 프래그먼트가 아닌 호스팅 액티비티에 전달된다는 것입니다. 이 문제를 해결하기 위해 두 가지 방법이 있습니다.
- Register the fragment to receive the button clicks?
- Pass the click events from the Activity to the fragment they belong to?
▪ 프래그먼트에서 버튼 클릭 이벤트를 받을 수 있도록 프래그먼트를 등록하는 방법이 있을까요?
▪ 또는 액티비티에서 프래그먼트가 속한 버튼 클릭 이벤트를 해당 프래그먼트로 전달하는 방법이 있을까요?
높은 점수를 받은 Solution
I prefer using the following solution for handling onClick events. This works for Activity and Fragments as well.
저는 onClick 이벤트를 처리하는 다음 솔루션을 선호합니다. 이 방법은 Activity와 Fragment에서 모두 작동합니다.
public class StartFragment extends Fragment implements OnClickListener{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_start, container, false);
Button b = (Button) v.findViewById(R.id.StartButton);
b.setOnClickListener(this);
return v;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.StartButton:
...
break;
}
}
}
가장 최근 달린 Solution
As I see answers they're somehow old. Recently Google introduce DataBinding which is much easier to handle onClick or assigning in your xml.
제가 이해한 바로는, 최근에 구글이 도입한 DataBinding을 사용하면 XML에서 클릭 이벤트를 처리하거나 할당하기가 훨씬 쉽다는 것입니다.
Here is good example which you can see how to handle this :
여기에는 이것을 처리하는 방법을 보여주는 좋은 예제가 있습니다:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="handlers" type="com.example.Handlers"/>
<variable name="user" type="com.example.User"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"
android:onClick="@{user.isFriend ? handlers.onClickFriend : handlers.onClickEnemy}"/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"
android:onClick="@{user.isFriend ? handlers.onClickFriend : handlers.onClickEnemy}"/>
</LinearLayout>
</layout>
There is also very nice tutorial about DataBinding you can find it Here.
DataBinding에 관한 아주 좋은 자습서도 있습니다. 이곳에서 찾아볼 수 있습니다.
출처 : https://stackoverflow.com/questions/6091194/how-to-handle-button-clicks-using-the-xml-onclick-within-fragments
'개발 > 안드로이드' 카테고리의 다른 글
안드로이드에서 Activity 재시작하기 (0) | 2022.12.20 |
---|---|
View 타입 객체의 setTag()와 getTag() 메서드의 주요 목적 (0) | 2022.12.20 |
안드로이드에서 전체 화면 액티비티 만들기 (0) | 2022.12.20 |
안드로이드에서 인텐트를 통해 구글 맵스 경로 안내 시작하기 (0) | 2022.12.19 |
사용자가 선택하기 전에 Spinner에서 onItemSelected가 실행되지 않게 하는 방법 (0) | 2022.12.19 |