다른 사람들은 이미 onClick의 메소드가 조각이 아닌 활동에서 검색된다고 말했습니다. 당신이 정말로 그것을 원한다면 그럼에도 불구하고, 그것은 이다 가능합니다.
기본적으로 각 뷰에는 태그가 있습니다 (아마도 null). 루트 뷰의 태그를 해당 뷰를 확장 한 조각으로 설정했습니다. 그러면 뷰 부모를 쉽게 검색하고 클릭 한 버튼이 포함 된 조각을 검색 할 수 있습니다. 이제 메서드 이름을 찾고 리플렉션을 사용하여 검색된 조각에서 동일한 메서드를 호출합니다. 쉬운!
확장하는 클래스에서 Fragment
:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_id, container, false);
OnClickFragments.registerTagFragment(rootView, this);
return rootView;
}
public void onButtonSomething(View v) {
Log.d("~~~","~~~ MyFragment.onButtonSomething");
}
모든 활동은 동일한 ButtonHandlingActivity에서 파생됩니다.
public class PageListActivity extends ButtonHandlingActivity
ButtonHandlingActivity.java :
public class ButtonHandlingActivity extends Activity {
public void onButtonSomething(View v) {
OnClickFragments.invokeFragmentButtonHandlerNoExc(v);
}
}
모든 xml onClick 핸들러에 대한 메소드를 정의해야합니다.
com / example / customandroid / OnClickFragments.java :
package com.example.customandroid;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import android.app.Fragment;
import android.view.View;
public abstract class OnClickFragments {
public static class FragmentHolder {
Fragment fragment;
public FragmentHolder(Fragment fragment) {
this.fragment = fragment;
}
}
public static Fragment getTagFragment(View view) {
for (View v = view; v != null; v = (v.getParent() instanceof View) ? (View)v.getParent() : null) {
Object tag = v.getTag();
if (tag != null && tag instanceof FragmentHolder) {
return ((FragmentHolder)tag).fragment;
}
}
return null;
}
public static String getCallingMethodName(int callsAbove) {
Exception e = new Exception();
e.fillInStackTrace();
String methodName = e.getStackTrace()[callsAbove+1].getMethodName();
return methodName;
}
public static void invokeFragmentButtonHandler(View v, int callsAbove) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException {
String methodName = getCallingMethodName(callsAbove+1);
Fragment f = OnClickFragments.getTagFragment(v);
Method m = f.getClass().getMethod(methodName, new Class[] { View.class });
m.invoke(f, v);
}
public static void invokeFragmentButtonHandler(View v) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException {
invokeFragmentButtonHandler(v,1);
}
public static void invokeFragmentButtonHandlerNoExc(View v) {
try {
invokeFragmentButtonHandler(v,1);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
public static void registerTagFragment(View rootView, Fragment fragment) {
rootView.setTag(new FragmentHolder(fragment));
}
}
그리고 다음 모험은 proguard 난독 화가 될 것입니다 ...
추신
그것은 데이터가에 살고 있도록 응용 프로그램을 설계하는 당신에게 물론 최대입니다 모델 이 아닌 (있는 활동 조각에 컨트롤러 로부터 MVC , 모델 - 뷰 - 컨트롤러의 관점). 보기 는 XML을 통해 정의, 플러스 사용자 정의 뷰 클래스 (당신이 그들을 정의하면, 대부분의 사람들은 이미 무엇을 재사용) 것입니다. 경험 법칙 : 일부 데이터가 화면 회전 후에도 확실히 유지되어야하는 경우 모델에 속합니다 .