单击片段B中的按钮时,更新片段A中的TextView

时间:2013-10-03 02:36:20

标签: android android-fragments

我有两个片段并排坐在同一个活动中。当我触摸右侧片段(片段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

有人可以帮我解决一下如何正确执行此操作的示例吗?

2 个答案:

答案 0 :(得分:3)

一个片段不应直接与另一个片段通信。它应该通过附加活动来实现。代码示例的详细说明可在此处获取

Android Developer site

在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);

}
}