6

我是 Android 编程的初学者,所以我需要你真诚的帮助。请任何人帮助我。

我正在尝试使用片段构建滑动 UI

所以我真正的疑问是......我有一个Fragment(比如FragmentA)它有一个TextViewButton在它和另一个Fragment(比如FragmentB)。它里面有一个TextView。当我在 FRAGMENT A 中按下 时,我需要在B's中显示Fragment A'sTextView的内容。我尝试了很多方法,不幸的是我没有得到正确的输出。我相信你们都知道。请帮我。FragmentTextViewButton

谢谢

4

6 回答 6

19

应该考虑监听器,所以片段仍然不相互依赖,可以在一个或两个窗格模式下使用。活动应该处理两个片段的侦听器。

这是一个包含两个片段的活动示例:

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>

片段一个 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 委托两个片段之间的消息/操作。允许 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

两个片段之间的通信应该始终通过它们的片段活动来保持片段之间的松散耦合,因此,如果您想将一些数据从一个片段 A 发送到另一个片段 B,您可以创建侦听器并在您的片段活动中实现它从片段A内部,您可以使用该侦听器触发事件​​并将数据发送到片段活动,因此现在片段活动也将具有片段B的对象,因此片段活动可以直接调用片段B的方法并将数据发送到片段B ...

于 2013-03-16T11:25:32.577 回答
0

developer.android.com

要允许 Fragment 与其 Activity 进行通信,您可以在 Fragment 类中定义一个接口并在 Activity 中实现它。Fragment 在其 onAttach() 生命周期方法期间捕获接口实现,然后可以调用接口方法以与 Activity 通信。

示例:- http://wiki.workassis.com/android-fragment-communication/

参考:- https://developer.android.com/training/basics/fragments/communicating.html

于 2016-06-08T11:47:18.837 回答
0

我喜欢这个活动成为片段到片段通信之间的中间人。但我喜欢的另一件事是使用事件总线架构,它也提供解耦。

于 2017-04-23T22:32:01.327 回答
-1

它实际上非常简单,只需按照以下步骤操作:

  1. 所以你创建了两个片段A和B,现在创建它们的大脑,即Java类文件。让我们称它们为 JClass A(用于 Fragment A)和 JClass B(用于 Fragment 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 文件)中:

    公共类 BottomSectionFrag 扩展片段 {

    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 回答