Những người khác đã nói rằng các phương thức trong onClick được tìm kiếm trong các hoạt động, không phải các đoạn. Tuy nhiên, nếu bạn thực sự muốn nó, nó là có thể.
Về cơ bản, mỗi chế độ xem có một thẻ (có thể là null). Chúng tôi đặt thẻ của chế độ xem gốc thành phân đoạn làm tăng chế độ xem đó. Sau đó, có thể dễ dàng tìm kiếm chế độ xem và truy xuất đoạn có chứa nút đã nhấp. Bây giờ, chúng ta tìm ra tên phương thức và sử dụng sự phản chiếu để gọi phương thức tương tự từ đoạn được truy xuất. Dễ dàng!
trong một lớp mở rộng 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");
// whatever
}
tất cả các hoạt động đều bắt nguồn từ cùng một ButtonHandlingActivity:
public class PageListActivity extends ButtonHandlingActivity
ButtonHandlingActivity.java:
public class ButtonHandlingActivity extends Activity {
public void onButtonSomething(View v) {
OnClickFragments.invokeFragmentButtonHandlerNoExc(v);
//or, if you want to handle exceptions:
// try {
// OnClickFragments.invokeFragmentButtonHandler(v);
// } catch ...
}
}
Nó phải xác định các phương thức cho tất cả các trình xử lý xml onClick.
com / example / customandroid / OnClickFragment.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));
}
}
Và cuộc phiêu lưu tiếp theo sẽ là sự che đậy ...
PS
Tất nhiên bạn phải thiết kế ứng dụng của mình sao cho dữ liệu nằm trong Mô hình chứ không phải trong Hoạt động hoặc Phân đoạn (là Bộ điều khiển theo quan điểm MVC , Model-View-Controller ). Các Xem là những gì bạn xác định thông qua xml, cộng với các lớp giao diện tùy chỉnh (nếu bạn định nghĩa chúng, hầu hết mọi người chỉ tái sử dụng những gì đã có). Một quy tắc chung: nếu một số dữ liệu chắc chắn phải tồn tại khi lật màn hình, chúng thuộc về Model .