我正试图做到这一点: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)
每当我点击第一个片段上的按钮,我的应用程序就会崩溃。到底是什么问题?
我使用上面罗迪恩先生的解决方案。但除此之外,Android Studio要求我在OneEvent
方法之前添加@Subscribe
注释。
像这样:
@Subscribe
public void onEvent(TextChangedEvent event) {
textView.setText(event.newText);
}
根据EventBus的API:
订阅服务器实现事件处理方法(也称为订阅服务器方法),这些方法将在发布事件时被调用。这些是用@订阅注释定义的。请注意,使用EventBus 3可以自由选择方法名称(没有像EventBus 2中那样的命名约定)。
片段可以访问这些父活动
因此,最简单的方法是在父活动中注册回调。
更新:提交缓存已添加到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);
}
}
操作步骤:
首先,创建一些类来表示文本更改时的事件:
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的一个新实例,而该实例尚