Java 在片段中有按钮操作,而不是主按钮

Java 在片段中有按钮操作,而不是主按钮,java,android,Java,Android,我有一个安卓应用程序,我使用带有ActionBarSherlock的标签。因此,我的主要活动为我创建选项卡,并从中加载片段布局 在my MainActivity.java中,我创建了一个选项卡,这只是一个片段: mTabsAdapter = new TabsAdapter(this, mViewPager); mTabsAdapter.addTab( bar.newTab().setText("Fragment 1"), MainMenuFragment.class, null

我有一个安卓应用程序,我使用带有ActionBarSherlock的标签。因此,我的主要活动为我创建选项卡,并从中加载片段布局

在my MainActivity.java中,我创建了一个选项卡,这只是一个片段:

mTabsAdapter = new TabsAdapter(this, mViewPager);

mTabsAdapter.addTab(
    bar.newTab().setText("Fragment 1"),
    MainMenuFragment.class, null);
My 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!!
    }
}
@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;
}
这是主菜单

现在我要做的就是将方法showMainMenuView视图放在某个地方。在我的例子中,我认为这会出现在相应的java文件mainmenuframent.java中。但它只有在我将该方法放入mainavity.java文件时才起作用


这意味着来自各种片段布局的所有按钮操作都将放在一个主java文件中。为什么我不能简单地将它放在调用片段布局的java文件中…?

现在我所要做的就是将方法showmain菜单放在某个地方-这是错误的。请参阅以下文件:

例如,如果指定android:onClick=sayHello,则必须声明上下文(通常是活动)的公共void sayHelloView v方法

似乎您无法将回调放在某个地方,因为框架将无法找到该回调。如果您在活动(实际上是一个上下文)中定义它,视图就有可能找到它。实际上,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属性规范调用布局文件中定义的回调的唯一可能方法。

现在我要做的就是将方法ShowMain菜单放在某个地方-这是错误的。请参阅以下文件:

例如,如果指定android:onClick=sayHello,则必须声明上下文(通常是活动)的公共void sayHelloView v方法

似乎您无法将回调放在某个地方,因为框架将无法找到该回调。如果您在活动(实际上是一个上下文)中定义它,视图就有可能找到它。实际上,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属性规范调用布局文件中定义的回调的唯一可能的方法。

简短的回答如前所述,您不能

唯一的方法是创建一个onClick-偶侦听器。在onCreate方法的MainMenuFragment.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!!
    }
}
@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属性。

简短的回答就像已经指出的那样,您不能

唯一的方法是创建一个onClick-偶侦听器。在onCreate方法的MainMenuFragment.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!!
    }
}
@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属性。

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

片段xml包含

安卓:onClick=myFunction

活动包含

public void myFunction(View v)
{ getSupportFragmentManager().findViewById/Tag(...).myFunction(v); }
然后,片段代码可以实现如下,以访问本地数据

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

希望这有帮助。

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

片段xml包含

安卓:onClick=myFunction

活动包含

public void myFunction(View v)
{ getSupportFragmentManager().findViewById/Tag(...).myFunction(v); }
然后,片段代码可以实现如下,以访问本地数据

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

希望这能有所帮助。

我不确定我是否遵守了。我知道该方法必须接收一个视图作为参数。问题是,我只能将onClick方法放在MainActivity.java文件中。但加载片段布局的是MainMenu.java。我只是想知道该文件是否可以处理onClick事件。提供了一些关于实际android视图源的详细信息。答案仍然是一样的——根本无法调用它,因为当前的android代码和活动片段存在根本性差异。请检查片段文档-它与活动不同,也与上下文无关。我不确定是否遵循。我知道该方法必须接收一个视图作为参数。问题是,我只能将onClick方法放在MainActivity.java文件中。但加载片段布局的是MainMenu.java。我只是想知道该文件是否可以处理onClick事件。提供了一些关于实际android视图源的详细信息。答案仍然是一样的——根本无法调用它,因为当前的android代码和活动片段存在根本性差异。请检查片段文档-它与活动不同,也与上下文无关。