我用了两个片段查看寻呼机:CurrentWeatherFragmentForecastFragment。我需要将字符串从一个传递到另一个,我使用下面这样的接口,但我一直得到NullPointerException,消息不是正确传递的…

public class CurrentWeatherFragment extends Fragment {

SendMessage SM

public void onCreateView(...) {
String Message = "Hello"
SM.sendData(Message);
}

interface SendMessage
{
    public  void sendData(String message);
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    try {
        SM = (SendMessage) activity;
    } catch(ClassCastException e) {
        throw  new ClassCastException("Musisz zaimplementowac metode sendData");
    }
}
}

main活动.java
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.os.Bundle;


public class MainActivity extends FragmentActivity implements CurrentWeatherFragment.SendMessage {

ViewPager viewPager;


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

    //setting fragment view pager
    viewPager = (ViewPager)findViewById(R.id.pager);
    PagerAdapter pagerAdapter = new PagerAdapter(getSupportFragmentManager());
    viewPager.setAdapter(pagerAdapter);
}

public void sendData (String message){
    ForecastFragment FF = new ForecastFragment();
    FF.getData(message);
}

}

forecastFragment.java
public class ForecastFragment extends Fragment {

public View onCreateView(){
TextView txt = (TextView)v.findViewById(R.id.txt_forecast);
}

public void getData(String message){
        txt.setText(message);
}
}

我在其他应用程序中成功地使用了这个方法,在一个活动中有两个片段,我可以通过id调用它们
public void sendData(String message) {

    SecondFragment f2 = (SecondFragment)getFragmentManager().findFragmentById(R.id.F2);
    f2.getData(message);
}

但是这里的片段没有id,我认为消息不会被传递,因为我不使用FragmentManager(),但是如何在没有id的viewpager中找到片段,有什么建议/想法吗?

最佳答案

尽管有点老套,但您可以使用以下代码通过其标记获取片段:

String tag = "android:switcher:" + R.id.pager + ":" + index;
Fragment f = getSupportFragmentManager().findFragmentByTag(tag);

其中r.id.pager是布局中viewpager的id,index是viewpager适配器中的位置(作为整数)。
我不能说这将永远有效,但它对我目前有效。
我建议的另一种方法是使用LocalBroadcastManager和BroadcastReceiver在片段之间内部发送数据,尽管这项工作稍微多了一点,但它有助于消除可能导致直接引用片段的意大利面代码情况。

08-26 09:55