java - 当只有一个 fragment 可见时, fragment 之间进行通信

标签 java android android-fragments

我在动态更改的 fragment 之间进行通信时遇到问题,如果 fragment 全部可见,我设法使用界面系统进行通信,但是当我单独查看它们时,我无法使用它们的操作,因为它们没有还没有标签,有什么想法吗?

主要 Activity

公共(public)类 MainActivity 扩展 FragmentActivity 实现 OnClickListener、Communicator {

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

if (isSingleFragment()) {

        Button btn_color = (Button) findViewById(R.id.button_color);
        Button btn_text = (Button) findViewById(R.id.button_text);
        Button btn_list = (Button) findViewById(R.id.button_list);
        btn_color.setOnClickListener(this);
        btn_list.setOnClickListener(this);
        btn_text.setOnClickListener(this);

        singleFragActions();

    } else {

        doubleFragActions();
    }


// some more stuff happens

@Override
public void apply(String data) {

    Log.d("data", data+"");
    FragmentManager fm = getSupportFragmentManager();
    Frag_list frag_list = (Frag_list) fm.findFragmentByTag("list");
//i cannot use id because the fragment in 
//MainActivity are in a layout and are enterd dynamicaly

    frag_list.addItem(data);

}

这里有三个 fragment ,当在小屏幕上时,会显示 ,并且顶部的三个按钮可以更改它们的排列,如果在平板电脑上,所有三个都会显示,这是界面

public interface Communicator {

public void apply(String data);

}

frag_text(第一个 fragment )

public class Frag_text extends Fragment implements OnClickListener{


Communicator comm;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // stuff
return view;

}


@Override
public void onActivityCreated(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onActivityCreated(savedInstanceState);

    comm = (Communicator) getActivity();
}
@Override
public void onClick(View v) {


    EditText input = (EditText) getView().findViewById(R.id.frag_text_edit);
    TextView output = (TextView) getView().findViewById(R.id.frag_text_show);

    String text_get = input.getText().toString();
    output.setText("hello "+text_get+" how are you today?");

    comm.apply(text_get);
}
}

frag_list(其他 fragment )

public class Frag_list extends Fragment{



ArrayList<String> list;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.frag_list, container, false);

list = new ArrayList<String>();



ArrayAdapter<String> adapter = 
    new ArrayAdapter<String>(getActivity(), 
         android.R.layout.simple_list_item_1, list);

ListView lv = (ListView) view.findViewById(R.id.list_frag);
lv.setAdapter(adapter);

return view;

}

public void addItem(String data){

    list.add(data);
}
}

如果另一个 fragment 还没有标签,我如何访问它?

最佳答案

如果您碰巧知道要调用哪个 fragment ,那么在这种情况下 FragmentActivity 可以充当中介,因为它只是一个“主机”。您已经拥有此 Communicator 界面。让它与给定的 fragment 通信:

public interface Communicator {
    public void apply(String data, String tag);
}

以及覆盖:

@Override
public void apply(String data, String tag) {
    FragmentManager fm = getSupportFragmentManager();
    Frag_list frag_list = (Frag_list) fm.findFragmentByTag(tag);
    //Fallback plan in case the fragment has not been created.
    if(frag_list == null) {
        frag_list = new Frag_list();
        //Include the fragment for future reference.
        //This fragment has no view
        fm.beginTransaction().add(frag_list, tag);
    }
    frag_list.addItem(data);
}

并修改 fragment 以始终使列表可用:

public class Frag_list extends Fragment{

ArrayList<String> list = new ArrayList<String>();
//...

    public void addItem(String data){
        //Add check to avoid problems
        if(list != null) {
            list.add(data);
        }
    }
}

关于java - 当只有一个 fragment 可见时, fragment 之间进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21882840/

相关文章:

java - 在没有支持库的情况下使用 FragmentStatePagerAdapter

android - Activity 未调用 onAttachFragment

c# - 从 SQL 语句中检索元数据(表名)

android - 谷歌云消息和安卓版

java - 如果不存在重复值,则将类/对象添加到数组列表

java - Oreo 中我自己的 URI 上的 ContentProvider.notifyChange 的安全异常

java - Hibernate继承映射: Table per subclass

java - Mybatis(iBatis) XML映射配置

java - 在 OS X 10.8 下的 Eclipse (4.3 Kepler) 中安装 GWT 插件并正常工作时出现问题

android - 如何将 MapsActivity 插入 fragment 容器?