คนอื่น ๆ ได้กล่าวไว้แล้วว่าวิธีการใน onClick ถูกค้นหาในกิจกรรมไม่ใช่ส่วนย่อย อย่างไรก็ตามหากคุณต้องการจริงๆก็เป็นไปได้
โดยพื้นฐานแล้วแต่ละมุมมองมีแท็ก (อาจเป็นค่าว่าง) เราตั้งค่าแท็กของมุมมองรูทเป็นส่วนที่ทำให้มุมมองนั้นสูงเกินจริง จากนั้นจึงง่ายต่อการค้นหาพาเรนต์ของมุมมองและดึงส่วนที่มีปุ่มคลิก ตอนนี้เราค้นหาชื่อวิธีการและใช้การสะท้อนเพื่อเรียกวิธีเดียวกันจากส่วนที่ดึงมา ง่าย!
ในชั้นเรียนที่ขยาย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));
}
}
และการผจญภัยครั้งต่อไปจะทำให้เกิดความสับสน ...
ปล
แน่นอนว่าขึ้นอยู่กับคุณในการออกแบบแอปพลิเคชันของคุณเพื่อให้ข้อมูลอยู่ในแบบจำลองมากกว่าในกิจกรรมหรือส่วนย่อย (ซึ่งเป็นตัวควบคุมจากมุมมองMVC , Model-View-Controller ) ดูคือสิ่งที่คุณกำหนดผ่านทาง XML รวมทั้งเรียนมุมมองที่กำหนดเอง (ถ้าคุณกำหนดให้คนส่วนใหญ่ก็นำมาใช้สิ่งที่มีอยู่แล้ว) กฎของหัวแม่มือ: ถ้าข้อมูลบางอย่างแน่นอนต้องเอาตัวรอดหันหน้าจอให้พวกเขาอยู่ในรุ่น