Yang lain telah mengatakan bahwa metode di onClick dicari dalam aktivitas, bukan fragmen. Namun, jika Anda benar-benar menginginkannya, itu adalah mungkin.
Pada dasarnya, setiap tampilan memiliki tag (mungkin null). Kami menyetel tag tampilan root ke fragmen yang meluaskan tampilan itu. Kemudian, mudah untuk mencari tampilan orang tua dan mengambil fragmen yang berisi tombol yang diklik. Sekarang, kita menemukan nama metode dan menggunakan refleksi untuk memanggil metode yang sama dari fragmen yang diambil. Mudah!
di kelas yang diperluas 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");
}
semua aktivitas diturunkan dari ButtonHandlingActivity yang sama:
public class PageListActivity extends ButtonHandlingActivity
ButtonHandlingActivity.java:
public class ButtonHandlingActivity extends Activity {
public void onButtonSomething(View v) {
OnClickFragments.invokeFragmentButtonHandlerNoExc(v);
}
}
Itu harus mendefinisikan metode untuk semua penangan onClick xml.
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));
}
}
Dan petualangan berikutnya akan menjadi kebingungan proguard ...
PS
Ini tentu saja terserah Anda untuk mendesain aplikasi Anda sehingga data tinggal di Model daripada di Aktivitas atau Fragmen (yang merupakan Pengontrol dari MVC , sudut pandang Model-View-Controller ). The View adalah apa yang Anda mendefinisikan melalui xml, ditambah kelas tampilan kustom (jika Anda mendefinisikan mereka, kebanyakan orang hanya menggunakan kembali apa yang sudah ada). Aturan praktis: jika beberapa data pasti harus selamat dari pergantian layar, itu adalah milik Model .