我有一个Android应用,我正在使用标签(使用ActionBarSherlock)。所以我的主要活动为我创建了标签,并从那里加载了片段布局。
在我的MainActivity.java
我创建了一个标签(这只是一个片段):
mTabsAdapter = new TabsAdapter(this, mViewPager);
mTabsAdapter.addTab(
bar.newTab().setText("Fragment 1"),
MainMenuFragment.class, null);
我的MainMenu.java看起来像这样:
public class MainMenuFragment extends SherlockFragment
{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.mainmenu_fragment, container, false);
return view;
}
public void showMainMenu(View view)
{
Log.e("app", "olol: button!"); // never called!!
}
}
这是mainmenu_fragment
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000" >
<Button
android:id="@+id/btnMenu"
android:layout_width="170dp"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="41dp"
android:text="@string/mainmenu"
android:onClick="showMainMenu" />
</RelativeLayout>
现在我所要做的就是将方法showMainMenu(View view)
放在某个地方。我以为这会进入相应的java文件(在我的例子中是MainMenuFragment.java)。但它只有在我将该方法放在MainAvtivity.java文件中时才有效。
这意味着来自各种片段布局的所有按钮操作都将放在一个(主)java文件中。为什么我不能简单地将它放在调用Fragment布局的java文件中。??
答案 0 :(得分:2)
现在我所要做的就是将方法showMainMenu()放在某处 - 这是错误的。请参阅android:onClick的文档:
例如,如果指定android:onClick =“sayHello”,则必须声明上下文的公共void sayHello(View v)方法(通常是您的Activity)。
似乎你无法将你的回调放在某处,因为框架将无法找到该回调。如果您在Activity(实际上是Context)中定义它,View可以找回它。实际上,View.java包含以下代码:
case R.styleable.View_onClick:
if (context.isRestricted()) {
throw new IllegalStateException("The android:onClick attribute cannot " + "be used within a restricted context");
}
final String handlerName = a.getString(attr);
mHandler = getContext().getClass().getMethod(handlerName, View.class);
...
mHandler.invoke(getContext(), View.this);
似乎这是使用当前的android:onClick属性规范调用布局文件中定义的回调的唯一可行方法。
答案 1 :(得分:2)
简短的答案(如已经指出的那样),你不能。
执行此操作的唯一方法是创建onClick甚至侦听器。在onCreate方法的MainMenuFragment.java中,执行以下操作:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.scan_fragment, container, false);
Button menuButton = (Button)view.findViewById(R.id.btnMenu);
menuButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Log.e("app", "onclick listener");
}
});
return view;
}
您可以从布局xml中删除onClick属性。
答案 2 :(得分:0)
我使用以下方法解决了这个问题:
片段xml包含
android:onClick="myFunction"
活动包含
public void myFunction(View v)
{ getSupportFragmentManager().findViewById/Tag(...).myFunction(v); }
然后,片段代码可以如下实现,以访问本地数据
public void myFunction(View v) {...}
希望这有帮助。