我有两个片段并排坐在同一个活动中。当我触摸右侧片段(片段B)中的按钮时,我需要在左侧片段中更新TextView(片段A)。我一直在寻找最好的方法来做到这一点,但似乎没有什么能满足我的需求。有人可能会给我一个如何编码的例子吗?片段A通过XML布局设置,片段B以编程方式加载到容器中。我尝试通过使用片段A中的方法来更新文本,并从父活动中的方法调用该方法来尝试完成此操作。然后,我从片段B调用父活动中的方法。
这是片段B中的代码,用于声明接口并在接口
中调用方法AttackCards attackCards;
public interface AttackCards {
public void deckSize();
}
public void onAttach(DeckBuilder deckBuilder) {
super.onAttach(deckBuilder);
attackCards = (AttackCards) deckBuilder;
}
attackCards.deckSize(); //this is in my onclick methods
这是实现接口并调用片段A
中的方法的活动中的代码public class DeckBuilder extends Activity implements AttackCards{
public void deckSize() {
DeckBuilderFragment deckBuilderFragment = (DeckBuilderFragment)getFragmentManager().
findFragmentById(R.id.deckbuilder_fragment);
deckBuilderFragment.deckSize();
}
这是片段A中的方法,它将textview附加共享首选项值
的内容public void deckSize() {
deckSize = (TextView) getView().findViewById(R.id.decksize);
final SharedPreferences defaultDeck = getActivity()
.getSharedPreferences("defaultDeck", Context.MODE_PRIVATE);
deckSize.setText(String.valueOf(defaultDeck.getInt("decksize", 0)));
}
可悲的是,这个尝试只是在触摸按钮时会给我一个空指针。我在
处得到一个空指针attackCards.deckSize(); //this is in my onclick methods
有人可以帮我解决一下如何正确执行此操作的示例吗?
答案 0 :(得分:3)
一个片段不应直接与另一个片段通信。它应该通过附加活动来实现。代码示例的详细说明可在此处获取
在Fragment B中声明一个接口,并在activity中实现该接口。单击按钮时,通过片段B中的回调调用接口。您可以在Fragment A中使用公共函数来更新TextView,因此activity直接调用该函数来更新文本。
答案 1 :(得分:1)
您可以在Fragment
B中定义接口并在MainActivity上实现它。然后在回调方法(在这种情况下为onClickOnB)上设置TextView
上的文本。您应该在TextView
之后获得Activity
onCreate()
中setContentView()
的引用。这是有效的,因为Fragment
A是静态的。否则,您可以在Fragment
A中创建一个公共方法,这样您就可以通过获取Fragment
A的引用并调用此方法来设置回调内部的文本。
Fragment
B
public class FragmentB extends Fragment implements onClickListener{
ClickOnB listener;
public void setOnFragmentBClickListener(ClickOnB listener){
this.listener = listener;
}
@Override
public void onClick(View v){
//stringMessage is a `String` you will pass to `Fragment` A to update its `TextView`
listener.onClickOnB(stringMessage);
}
interface ClickOnB{
public void onClickOnB(String message);
}
}
MainActivity
public class MainActivity extends Activity implements ClickOnB{
@Override
protected onCreate(Bundle savedInstanceState){
//Get a reference of `Fragment` B somewhere in your code after you added it dynamically and set the listener.
((FragmentB)getFragmentManager().findFragmentByTag("FragmentB")).setOnFragmentBClickListener(this);
}
@Override
public void onClickOnB(String message){
//Set the text to the `TextView` here (I am assuming you get a reference of the `TextView` in onCreate() after inflating your layout.
mTextView.setText(message);
}
}