3

Android 3.0以降では、Androidチームは、アクティビティよりもフラグメントを使用する必要があることを強く求めています。これは便利だと思いますが、アプリでクリックイベントを処理できるようにしたいと思います。アプリの右側でリストフラグメントを使用しているため、フラグメントをホストするアクティビティでonclick(または任意のクリックリスナー)を実行します。そのため、アイテムをXMLに配置することから、フラグメントマネージャーを使用することに移行する必要がありました。

設計ドキュメントでは、次の図が示されています。誤解を招く写真

http://developer.android.com/training/basics/fragments/fragment-ui.html

私が欲しいのはフラグメントA/BタブレットUIです。ただし、このページのどこにも、実際にこれを行う例は示されていません。フラグメントマネージャは、一度に1つのフラグメントしか処理できないようです。これは、画像が表すものとはまったく逆です。それは私にそれがXMLで使用していると思わせます...しかしそれではどのように私はonclickを得るでしょうか?これらのドキュメントは私にはあまり意味がありません。それは一つのことを示し、それから別のことを言います。タブレットのフラグメントAを削除したい場合はどうなりますか?まだ存在しないフラグメントCを追加しますか?Fragment Managerを使おうとしても、それは可能ですか????

フラグメントマネージャーが複数のフラグメントを使用している場合は取得できないと思います。使用している場合、タブレットのような画像内のアイテムを取得するためにこれをどのように使用する必要がありますか?左側(A)はリストビューであり、右(B)何でも。フラグメントのIDがないと、アクセスする方法がありません。

これが適切かどうかはわかりませんが、私のコードの一部を次に示します。

ガイドのように作成した単一のフレームレイアウトにフラグメントを追加します

//Activity              
FragLaunch launchPane = new FragLaunch();
                // In case this activity was started with special instructions from an Intent,
                // pass the Intent's extras to the fragment as arguments
                // firstFragment.setArguments(getIntent().getExtras());

                // Add the fragment to the 'fragment_container' FrameLayout
                getFragmentManager().beginTransaction()
                        .add(R.id.launch_frag_container, launchPane).commit();
            }

また、7インチタブレットのポートレートモードでは、スワイプ可能なビューページャーを使用する必要があります。XMLで設計したときは魅力のように機能しましたが、リストフラグメントにアクセスする必要があるため、機能しません( 2つのフラグメントを持つことができないためアクセス)

FragLaunchのコンテンツビューのXML:

<LinearLayout 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:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:gravity="center_vertical"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/initial_directions"
        style="@style/textScalar.Roboto.Light"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="@string/initial_directions"
        android:layout_marginBottom="30dp"
        tools:context=".Launch" />

</LinearLayout>

これを写真のフラグメントAとして表示したい:フラグメントのFragHistory.java/xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/spamhistory"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Spam History" />

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_weight="1"
        android:drawSelectorOnTop="false" />

</LinearLayout>

誰かがこれについて何か洞察を持っていますか?

4

2 に答える 2

1

フラグメント間の通信を可能にするもう 1 つの優れた方法は、 Ottoイベント バスなどのイベント バスを使用することです。Otto では、コンポーネントがイベントを発行し、分離された方法でイベントをサブスクライブできます。

特定のケースでは、ユーザーがリスト内のアイテムを選択すると、リスト フラグメントはイベント (選択されたアイテムを含むことができます) を発行でき、コンテンツ フラグメントはこれらのイベントをサブスクライブし、受信時にそれに応じてコンテンツを更新できます。新しいイベント。これはすべて、2 つのフラグメントが直接結合されたり、追加のインターフェイスを定義したりすることなく行われます。

これで質問全体に答えられないことはわかっていますが、フラグメント間の通信に関しては役立つかもしれないと思いました.... YMMV.

于 2013-04-26T07:15:46.797 に答える
1

フラグメントが通信できるようにする場合は、このようなインターフェースを使用する必要があります。

onClick イベントの場合、onClick イベントを受信する必要があるビューの onClickListener を設定するだけです。そのようです:

sampleView.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        //Your code here
    }
});

フラグメント トランザクションに関しては、2 つのフラグメントが一度に画面に表示された場合 (より大きな画面の場合と同様)、フラグメントを交換する代わりに単純に更新することがどこかに記載されています (正確な場所は思い出せません)。心配する必要があるのは、正しい呼び出しを行うことだけです。したがって、フラグメント A を削除したい場合は、remove() を呼び出すだけです。または、フラグメント C で置き換えたい場合は、replace() を呼び出し、フラグメント C をパラメーターとして渡します。

ViewPager に関する質問を明確にできますか? 「アクセスする必要がある」とはどういう意味ですか?

お役に立てれば!

編集:お詫び申し上げます。あなたの質問を誤解していました。画面に複数のフラグメントを一度に追加する方法を簡単に説明します。

1.ランタイム チェックを実行して、デバイス画面が複数のフラグメントを表示するのに十分な大きさであることを確認します。

2.画面が十分に大きい場合は、追加するフラグメントごとに FrameLayout を持つレイアウトを使用するようにコンテンツ ビューを設定します。

3.その後、使用する各フラグメントへの参照を取得します。

4. FragmentManager を使用して、各レイアウトにフラグメントを追加します。このような:

FirstExampleFragment fragment1 = new FirstExampleFragment();
SecondExampleFragment fragment2 = new SecondExampleFragment();

getSupportFragmentManager().beginTransaction().add(R.id.example_framelayout1, fragment1)
.add(R.id.example_framelayout2, fragment2).commit();
于 2013-01-23T07:51:24.880 に答える