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 ファイルに配置した場合にのみ機能します。

つまり、あらゆる種類のフラグメント レイアウトからのすべてのボタン アクションが、1 つの (メイン) Java ファイルに格納されます。Fragmentレイアウトを呼び出すJavaファイル内に単純に配置できないのはなぜですか..??

4

3 に答える 3

2

今私がしなければならないのは、メソッドshowMainMenu()をどこかに配置することだけです-これは間違っています。android:onClickのドキュメントを参照してください:

たとえば、android:onClick = "sayHello"を指定する場合は、コンテキスト(通常はアクティビティ)のpublic void sayHello(View v)メソッドを宣言する必要があります。

フレームワークがそのコールバックを見つけることができないため、コールバックをどこかに配置できないようです。アクティビティ(実際にはコンテキスト)内で定義している場合、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 に答える