簡體   English   中英

從片段2更新片段1 UI

[英]Updating fragment 1 UI from fragment 2

frag1調用frag 2,而frag 2調用frag1中的方法來更新textview。 該代碼有效(不會崩潰),但是frag1 UI(當我從frag2返回時)未更新/

這是有效的方法嗎? 有沒有辦法更新用戶界面?

這是frag1和frag2代碼:

public class Frag1 extends android.app.Fragment {
    private static TextView txt;
    public Frag1() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootview = null;
        rootview = inflater.inflate(R.layout.fragment_frag1, container, false);
        return rootview;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        txt = (TextView) getActivity().findViewById(R.id.txt);
        Button btn = (Button) getActivity().findViewById(R.id.btn1);
        btn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                FragmentTransaction ft = getFragmentManager().beginTransaction();
                Frag2 f2 = new Frag2();
                ft.replace(R.id.content_frame, f2);
                ft.addToBackStack(null);
                ft.commit();
            }
        });

    }

    void setTxt(String s){
        txt.setText(s);
    }

}

和frag2-setTxt()方法更新frag1中的textview:

public class Frag2 extends Fragment {
    private Button btn2;

    public Frag2() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootview;
        rootview = inflater.inflate(R.layout.fragment_frag2, container, false);
        Log.i("frag2","createdview");
        return rootview;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        Frag1 f1 = new Frag1();
        f1.setTxt("msg from frag2");

        btn2 = (Button) getActivity().findViewById(R.id.btn2);
        btn2.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                FragmentTransaction ft = getFragmentManager().beginTransaction();
                Frag3 f3 = new Frag3();
                ft.replace(R.id.content_frame, f3);
                ft.addToBackStack(null);
                ft.commit();
            }
        });

    }
}

您可以從片段2中廣播意圖

    Intent intent = new Intent("key_to_identify_the_broadcast");
    Bundle bundle = new Bundle();
    bundle.putString("edttext", json.toString());
    intent.putExtra("bundle_key_for_intent", bundle);
    context.sendBroadcast(intent);

然后您可以使用BroadcastReceiver類在碎片1中接收捆綁包

private final BroadcastReceiver mHandleMessageReceiver = new 
BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = 
            intent.getExtras().getBundle("bundle_key_for_intent");
            if(bundle!=null){
                String edttext = bundle.getString("edttext");
            }
            //you can call any of your methods for using this bundle for your use case
    }
};

在片段的onCreateView()中,您需要先注冊廣播接收器,否則將不會觸發此廣播接收器

IntentFilter filter = new IntentFilter("key_to_identify_the_broadcast");
getActivity().getApplicationContext().
               registerReceiver(mHandleMessageReceiver, filter);

最后,您可以取消注冊接收者以避免任何異常

@Override
public void onDestroy() {
    try {

         getActivity().getApplicationContext().
             unregisterReceiver(mHandleMessageReceiver);

    } catch (Exception e) {
        Log.e("UnRegister Error", "> " + e.getMessage());
    }
    super.onDestroy();
}

您可以在所有片段中創建單獨的廣播接收器,並使用相同的廣播將數據廣播到所有片段。 您還可以對不同的片段使用不同的密鑰,然后對特定的片段使用特定的密鑰進行廣播。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM