Diğerleri, onClick'teki yöntemlerin parçalarda değil etkinliklerde arandığını zaten söyledi. Yine de, gerçekten istiyorsan , mümkün.
Temel olarak, her görünümün bir etiketi vardır (muhtemelen boştur). Kök görünümün etiketini bu görünümü şişiren parçaya ayarladık. Ardından, görünüm üst öğelerini aramak ve tıklanan düğmeyi içeren parçayı almak kolaydır. Şimdi, yöntemin adını buluyoruz ve aynı yöntemi alınan parçadan çağırmak için yansımayı kullanıyoruz. Kolay!
genişleyen bir sınıfta 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");
}
tüm etkinlikler aynı ButtonHandlingActivity'den türetilir:
public class PageListActivity extends ButtonHandlingActivity
ButtonHandlingActivity.java:
public class ButtonHandlingActivity extends Activity {
public void onButtonSomething(View v) {
OnClickFragments.invokeFragmentButtonHandlerNoExc(v);
}
}
Tüm xml onClick işleyicileri için yöntemler tanımlaması gerekir.
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));
}
}
Ve bir sonraki macera proguard şaşırtma olacak ...
PS
Verilerin yaşayan böylece uygulama tasarlamak için size elbette kadar taşımaktadır Modeli ziyade (vardır Etkinlikler veya Fragments içinde Kontrolörler gelen MVC , Model-View-Controller bakış açısından). Görünüm Eğer xml yoluyla tanımlamak, artı özel görünüm sınıfları (bunları tanımlarsanız, çoğu insan sadece zaten ne olduğunu yeniden) budur. Dikkat etmeniz gereken bir kural: bazı veriler kesinlikle ekran dönüş hayatta gerekiyorsa, ait oldukları Modeli .