0

我有两个片段并排坐在同一个活动中。当我触摸右侧片段(片段 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 中的方法,它将文本视图附加到共享首选项值的内容

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

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

4

2 回答 2

3

一个片段不应直接与另一个片段通信。它应该通过附加的活动来做到这一点。此处提供了带有代码示例的详细说明

Android 开发者网站

在 Fragment B 中声明一个接口,并在 Activity 中实现该接口。单击按钮时,通过 Fragment B 中的回调调用接口。您可以在 Fragment A 中有一个公共函数来更新 TextView,因此活动直接调用该函数来更新文本。

于 2013-10-03T03:28:52.730 回答
1

您可以在 B 中定义一个接口Fragment并在 MainActivity 上实现它。然后在回调方法(本例中为 onClickOnB)上设置文本TextViewTextView您应该在Activity's onCreate()after中获得参考setContentView()。这是有效的,因为FragmentA 是静态的。否则,您可以在FragmentA 内部创建一个公共方法,以便通过获取FragmentA 的引用并调用此类方法来从回调内部设置文本。

Fragment

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

}
}
于 2013-10-03T02:38:43.597 回答