当前位置: 首页 > 知识库问答 >
问题:

ViewPager中片段之间的通信

公胤运
2023-03-14

我正试图做到这一点:http://android-er.blogspot.com/2012/06/communication-between-fragments-in.html只不过我用的是一台碎纸机

我有一个有两个片段的活动

FragmentA有一个编辑文本和一个按钮,FragmentB有一个文本视图

现在我想要的是,每当我在编辑文本中输入一些内容并单击按钮时,我的文本视图中就会出现一些内容。

主要活动:

public class MainActivity extends FragmentActivity {


    ViewPager viewPager = null;
    String TabFragmentB;

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

        viewPager = (ViewPager)findViewById(R.id.pager);    
        FragmentManager fragmentManager = getSupportFragmentManager();
        viewPager.setAdapter(new MyAdapter(fragmentManager));

    }

    public class MyAdapter extends FragmentStatePagerAdapter {  

        public MyAdapter (FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int i) {
            Fragment fragment = null;

            if (i == 0)
            {
                fragment = new FragmentA();
            }
            if (i == 1)
            {
                fragment = new FragmentB();
            }
            return fragment;
        }

        @Override
        public int getCount() {
            return 2;
        }   
    }

    public void setTabFragmentB(String t) {
        TabFragmentB = t;   
    }

    public String getTabFragmentB() { 
        return TabFragmentB;
    }

}

片段A:

public class FragmentA extends Fragment {

    EditText et;
    Button bt;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.fraga, container, false);

        et = (EditText)v.findViewById(R.id.edit1);
        bt = (Button)v.findViewById(R.id.button1);
        bt.setOnClickListener(Click);

        return v;
    }

    OnClickListener Click = new OnClickListener(){

        @Override
        public void onClick(View v) {

            String textPassToB = et.getText().toString();

            String TabOfFragmentB = ((MainActivity)getActivity()).getTabFragmentB();

            FragmentB fragmentB = (FragmentB)getActivity()
               .getSupportFragmentManager()
               .findFragmentByTag(TabOfFragmentB);

            fragmentB.updateText(textPassToB);          
        }   
    };

}

片段B:

public class FragmentB extends Fragment {

    TextView tv;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.fragb, container, false);    

        tv = (TextView)v.findViewById(R.id.text1);
        String myTag = getTag();

        ((MainActivity)getActivity()).setTabFragmentB(myTag);

        return v;
    }

    public void updateText(String t){
          tv.setText(t);
         }

}

LogCat:

FATAL EXCEPTION: main
 java.lang.NullPointerException
        at lmf.sample1.FragmentA$1.onClick(FragmentA.java:43)
        at android.view.View.performClick(View.java:4212)
        at android.view.View$PerformClick.run(View.java:17476)
        at android.os.Handler.handleCallback(Handler.java:800)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:194)
        at android.app.ActivityThread.main(ActivityThread.java:5371)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:525)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
        at dalvik.system.NativeStart.main(Native Method)

每当我点击第一个片段上的按钮,我的应用程序就会崩溃。到底是什么问题?

共有3个答案

尹钱青
2023-03-14

我使用上面罗迪恩先生的解决方案。但除此之外,Android Studio要求我在OneEvent方法之前添加@Subscribe注释。

像这样:

@Subscribe
public void onEvent(TextChangedEvent event) {
    textView.setText(event.newText);
}

根据EventBus的API:

订阅服务器实现事件处理方法(也称为订阅服务器方法),这些方法将在发布事件时被调用。这些是用@订阅注释定义的。请注意,使用EventBus 3可以自由选择方法名称(没有像EventBus 2中那样的命名约定)。

袁亦
2023-03-14

片段可以访问这些父活动
因此,最简单的方法是在父活动中注册回调。

更新:提交缓存已添加到MainActivity。

    public class MainActivity extends FragmentActivity {

        private OnButtonClicked mOnButtonClicked;
        private String mSubmitCache;

        public interface OnButtonClicked {
            void submit(final String s);
        }

        public void setOnButtonClicked(final OnButtonClicked c) {
            mOnButtonClicked = c;
            // deliver cached string, if any
            if (TextUtils.isEmpty(mSubmitCache) == false) {
                c.submit(mSubmitCache);
            }
        }

        public void buttonClicked(final String s)  {
            if (mOnButtonClicked == null) {
                // if FragmentB doesn't exist jet, cache value
                mSubmitCache = s;
                return;
            }
            mOnButtonClicked.submit(s);
        }
    }

    public class FragmentA extends Fragment implements OnClickListener {

        private MainActivity mMain;
        private Button mButton;

        @Override public onAttach(Activity a) {
            mMain = (MainActivity) a;
        }

        @Override public void onClick(View v) {
            mMain.buttonClicked("send this to FragmentB.");
        }
    }

    public class FragmentB extends Fragment implements MainActivity.OnButtonClicked {

        private MainActivity mMain;
        private TextView mTextView;

        // Called when the fragment's activity has been created
        // and this fragment's view hierarchy instantiated
        @Override public void onActivityCreated(Bundle savedState) {
            mMain = (MainActivity) getActivity();
            mMain.setOnButtonClicked(this);
        }

        @Override void submit(final String s) {
            mTextView.setText(s);
        }
    }
巢安澜
2023-03-14
  1. 您可以使用意图(在片段B中注册广播接收器,并从片段A发送广播。
  2. 使用EventBus:https://github.com/greenrobot/EventBus.这是我最喜欢的方法。使用非常方便,任何组件(活动)之间的通信都很方便

操作步骤:

首先,创建一些类来表示文本更改时的事件:

public class TextChangedEvent {
  public String newText;
  public TextChangedEvent(String newText) {
      this.newText = newText;
  }
}

然后,在片段A中:

//when text changes
EventBus bus = EventBus.getDefault();
bus.post(new TextChangedEvent(newText));

在片段B中:

EventBus bus = EventBus.getDefault();

//Register to EventBus
@Override
public void onCreate(SavedInstanceState savedState) {
 bus.register(this);
}

//catch Event from fragment A
public void onEvent(TextChangedEvent event) {
 yourTextView.setText(event.newText);
}
 类似资料:
  • 在中单击按钮时,必须将该值传递给 我在谷歌上找到了直接放在MainActivity中的片段之间的通信

  • 问题内容: 需要专家意见,我应该如何构造这个问题。我有一个自定义方法 process_filter ,它驻留在一个片段中,因为它需要访问私有和该片段。 在处理过程中,此片段将访问一个,并且在其中我需要使用back process_filter 方法 基本上,这里是结构: MyFragment.java MyAdapter.java 问题答案: 创建一个从适配器到片段的接口。 在适配器中创建接口,并

  • 我有一个包含两个片段的活动:一个用于在网格视图中显示产品,另一个用于显示用户添加到订单中的产品(ListFragment)。当用户在网格视图中单击一个产品时,我需要的是显示一个对话框(DialogFragment),我在其中询问所需产品的数量。然后,当用户在对话框中单击Accept时,我希望产品出现在ListFragment中。 一方面,我必须将产品对象传递给对话框,以便将其名称显示为对话框的标题

  • 我有一个活动- 。在这个活动中,我有两个片段,这两个片段都是我在xml中以声明方式创建的。 我正在尝试将用户输入的文本的传递到Fragment B 我知道一个片段可以使用获得对其活动的引用。所以我猜我会从那里开始?

  • 我正在考虑一个简单的例子,包括以下部分: Main活动:有编辑文本、按钮、viewPager 碎片A:什么都没有 碎片B:有文本视图 所以,在屏幕上,你可以滑动查看每个片段。我希望我的例子有这样一个功能:如果一个人在editText中写了一个文本,然后点击按钮,它就会出现在片段B中。 A使用notifyDatsetChanged()尝试了它,但不起作用。有人能帮忙吗?下面是我的全部代码: 主要活动

  • 我有一个活动和两个片段的包含一个。现在我可以通过实现谷歌的指南回调界面从片段到活动进行通信。但是我如何从活动到片段的另一种方式交流呢?如果活动(外部事件)中发生了什么,我想更新片段。我设法得到了Frag1碎片 但当我在frag上调用公共方法时,我得到了一个IllegalStateException:片段未附加到Activity,可能是因为getItem(0)返回了Frag1的一个新实例,而该实例尚