6

私はAndroidプログラミングの初心者レベルなので、これについてあなたの誠実な助けが必要です. 誰でも私を助けてください。

フラグメントを使用して SLIDING UI を構築しようとしています

だから私の実際の疑いは...私はFragmentFragmentAと言う)それはそれTextViewButton別のものFragmentFragmentBと言う)を持っています。がTextView入っています。FRAGMENT A でを押したときに、 B のFragment ATextView内容を表示する必要があります。多くの方法を試しましたが、残念ながら適切な出力が得られませんでした。私はあなたの人々がそれについて知っていると確信しています。私を助けてください。FragmentTextViewButton

ありがとうございました

4

6 に答える 6

19

リスナーと考え​​て行う必要があるため、フラグメントは互いに依存せず、1 つまたは 2 つのペイン モードで使用できます。アクティビティは、両方のフラグメントのリスナーを処理する必要があります。

2 つの Fragment を使用したアクティビティの例を次に示します。

package com.example;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;

import com.example.fragment.FragmentA;
import com.example.fragment.FragmentA.TextChangeListener;
import com.example.fragment.FragmentB;

public class ActivityAB extends FragmentActivity {

    FragmentA fragmentA;
    FragmentB fragmentB;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ab);

        FragmentManager manager = getSupportFragmentManager();
        fragmentA = (FragmentA) manager.findFragmentById(R.id.fragmentA);
        fragmentB = (FragmentB) manager.findFragmentById(R.id.fragmentB);

        fragmentA.setTextChangeListener(new TextChangeListener() {

            @Override
            public void onTextChange(CharSequence newText) {
                fragmentB.updateTextValue(newText);
            }
        });
    }

}

これは、テキスト変更イベントのカスタム リスナーを持つフラグメント A です。

package com.example.fragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

import com.example.R;

public class FragmentA extends Fragment {

    TextChangeListener listener;

    public interface TextChangeListener {
        public void onTextChange(CharSequence newText);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_a, container, false);

        Button btn = (Button) view.findViewById(R.id.button1);
        final TextView textView = (TextView) view.findViewById(R.id.textView1);

        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if (null != listener) {
                    listener.onTextChange(textView.getText());
                }

            }
        });
        return view;
    }

    public void setTextChangeListener(TextChangeListener listener) {
        this.listener = listener;
    }
}

テキストフィールドを更新するパブリックメソッドを持つフラグメント B は次のとおりです。

package com.example.fragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.example.R;

public class FragmentB extends Fragment {

    TextView textView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_b, container, false);
        textView = (TextView) view.findViewById(R.id.textView1);
        return view;
    }

    public void updateTextValue(CharSequence newText) {
        textView.setText(newText);
    }
}

ActivityAB 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:baselineAligned="false"
    android:orientation="horizontal" >

    <fragment
        android:id="@+id/fragmentA"
        android:name="com.example.fragment.FragmentA"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1" />

    <fragment
        android:id="@+id/fragmentB"
        android:name="com.example.fragment.FragmentB"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1" />

</LinearLayout>

フラグメント A 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" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="This is text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Show" />

</LinearLayout>

フラグメント B 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" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="(here will be text)"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>
于 2013-03-16T11:12:36.537 に答える
2

セットアップが次のようなものであるかのように聞こえます- MainActivity w/ FragmentA [追加] および FragmentB [追加]。この場合、MainActivity を介して 2 つのフラグメント間のメッセージ/アクションを委任します。MainActivity がメッセージ/アクションを処理できるようにすることで、フラグメント間のより複雑な状況で必要になる可能性のある「特別な」オーケストレーションも容易になります。例えば:

public interface FragmentCommunicator
{
    public void sendMessage ( String broadcastMessage );
    public void takeAction ( String name, int action, Fragment frag );
}

public class MainActivity extends Activity implements FragmentCommunicator
{
    Fragment fragA;
    Fragment fragB;
    ...
    @Override
    public void sendMessage ( String msg )
    {
        if ( msg.Contains("Send To fragA") )
            fragA.receiveMsg(msg);
        ...
    }
    @Override
    public void takeAction ( String name, int action, Fragment frag )
    {
    if ( action == CLOSE )
            removeFragment( name, frag );
        ...
    }
}

public class FragmentA extends Fragment
{
    ...
@Override
public void onClick(View v)
{   
     FragmentCommunicator inter = (FragmentCommunicator) getActivity();
     inter.sendMessage("the txt/information/etc you want to send to fragB");    
}
}

public class FragmentB extends Fragment
{
    ...
    public void receiveMsg ( String msg )
    {
        textView.setText(msg);
    }
}

FragmentA の送信部分を投稿するのを忘れていました。お役に立てれば。

于 2014-04-09T20:48:58.820 に答える
0

2 つのフラグメント間の通信は、フラグメント間の疎結合を維持するために、常にフラグメント アクティビティを介して行う必要があります。したがって、あるフラグメント A から別のフラグメント B にデータを送信する場合は、リスナーを作成してフラグメント アクティビティに実装し、 fragmentA 内から、そのリスナーを使用してイベントを発生させ、データをフラグメント アクティビティに送信できます。したがって、フラグメント アクティビティはフラグメント B のオブジェクトも持つようになり、フラグメント アクティビティはフラグメント B のメソッドを直接呼び出して、データをフラグメント B に送信できます。 ...

于 2013-03-16T11:25:32.577 に答える
-1

実際には非常に簡単です。次の手順に従ってください。

  1. 2 つのフラグメント A と B を作成したので、今度はそれらの頭脳、つまり Java クラス ファイルを作成します。それらを JClass A (フラグメント A の場合) および JClass B (フラグメント B の場合) と呼びましょう。

2. Frag A にボタンがあるので、JClass A に移動し、ユーザーが入力した文字列テキストとボタンが押されたイベントを次のように取得します。 // onCreate メソッドをオーバーライドするだけです。

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.<name of your fragment A.xml file>,container,false);

    userInput = (EditText)view.findViewById(R.id.<Id that you gave to EditText field in which user enters text>);

    Button myButton = (Button)view.findViewById(R.id.<id of your Button>);
    myButton.setOnClickListener(
            new Button.OnClickListener(){
                public void onClick(View v){
                    JClassB.setText(userInput.getText().toString());/*Replace JClassB with the java class of Fragment B*/

                }
            }
    );

    return view;
}
  1. 最後に、JClass B (フラグメント B の Java ファイル) で:

    public class BottomSectionFrag extends Fragment {

    private static TextView userText;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragmentB, container, false);
        userText = (TextView)view.findViewById(R.id.userText);
        return view;
    }
    public static void setText(String text){
        userText .setText(text);
    
    }
    

    }

出来上がり!

PSこれはstackOverFlowに関する私の最初の投稿です:D

ピースアウト。

于 2016-08-11T14:25:27.983 に答える