Остальные уже говорили, что методы 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");
// whatever
}
все виды деятельности получены из того же 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 ...
}
}
Он должен определять методы для всех обработчиков xml onClick.
ком/пример/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 запутывания ...
PS
Это, конечно, зависит от вас для разработки вашего приложения, чтобы данные находились в Model, а не в действиях или фрагментах (которые являются Контроллеры от MVC, Model-View-Controller). View - это то, что вы определяете через xml, а также пользовательские классы представления (если вы их определяете, большинство людей просто повторно используют то, что уже есть). Эмпирическое правило: если некоторые данные обязательно должны пережить поворот экрана, они относятся к Модель.
Пожалуйста, напишите больше о стеке и соответствующем коде – Emmanuel
Как указано здесь http://developer.android.com/guide/topics/ui/controls/button.html#HandlingEvents, тогда необходимо выполнить операцию, в которой размещается макет соответствующий метод ». В вашем случае вы реализовали соответствующий метод в своем фрагменте. Из-за этого он выбрасывает IllegalStateException, потому что не может найти соответствующий метод в активности. Возможно, вы можете применить трюк, как показано в этом сообщении. Http://stackoverflow.com/a/6271637/2515815 – hcelaloner
Метод insertIntoDb (View) должен быть в main.MainActivity, а не в классе Fragment. – betorcs