1

我有一个使用标签的 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文件中。为什么我不能简单地将它放在调用片段布局的java文件中..??

4

3 回答 3

2

现在我要做的就是将方法 showMainMenu() 放在某个地方——这是错误的。请参考android:onClick的文档:

例如,如果您指定 android:onClick="sayHello",则必须声明您的上下文(通常是您的 Activity)的 public void sayHello(View v) 方法。

似乎您无法将回调放置在某处,因为框架将无法找到该回调。如果您在 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 属性规范调用布局文件中定义的回调的唯一可能方法。

于 2012-07-23T07:20:19.663 回答
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 属性。

于 2012-07-23T07:51:31.340 回答
0

我使用以下方法解决了这个问题:

片段 xml 包含

android:onClick="myFunction"

活动包含

public void myFunction(View v)
{ getSupportFragmentManager().findViewById/Tag(...).myFunction(v); }

然后片段代码可以如下实现以访问本地数据

public void myFunction(View v) {...}

希望这可以帮助。

于 2012-07-23T09:35:21.757 回答