片段与其他活动之间的沟通

时间:2016-08-10 11:41:43

标签: android android-fragments

public class FragActivity1 extends Fragment implements View.OnClickListener {

    View view;
    ImageButton name_change__btn, status_change_btn, profile_change_btn;
    ImageView person_dp;
    TextView status_field , name_field;
    .
    .
    . 
    .some code here

我这个包含changeName方法的类正在改变textview的文本。 name_field写为:

name_field=(TextView)view.findViewById(R.id.name_field);

现在我从弹出按钮调用此方法,我在运行时传递一些字符串值。

我得到了nullpointer异常。

 public void changeName(String s)
{

    Log.d("changename entry" ,"changename netry");
    System.out.println(s);
    System.out.println(name_field.getText().toString());
       name_field.setText(s);
    System.out.println(name_field.getText());
}

以下是弹出类的代码:

public class Name_Status extends AppCompatActivity implements View.OnClickListener {

    EditText name_change;
    RelativeLayout name_status_edit_field;
    String name;
    Button cancel_name_change , ok_name_change;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.name_status);
         DisplayMetrics dm=new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);

        int width=dm.widthPixels;
        int height=dm.heightPixels;

        getWindow().setLayout((int)(width*.8),(int)(height*.3));
        name_change=(EditText)findViewById(R.id.change_name);
        name_status_edit_field=    (RelativeLayout)findViewById(R.id.name_status_edit_field);

        cancel_name_change=(Button)findViewById(R.id.cancel_change_name);
        ok_name_change=(Button)findViewById(R.id.ok_change_name);
        ok_name_change.setOnClickListener(this);
        name_change.setOnClickListener(this);
       name_status_edit_field.clearFocus();
        name_change.setFocusable(true);
        //name_change.update();
    }

    @Override
    public void onClick(View v) {

               if(v.getId()==R.id.ok_change_name)

               {
                   name=name_change.getText().toString();
                   System.out.println(name);
                   Log.d("entered","entred");
                   FragActivity1 obj=new FragActivity1();
                   Log.d("obj created", "obj created");
                   obj.changeName(name);
                   Log.d("obj.changename","obj.changename");
                   Intent intent=new Intent();
                   Log.d("intenthsjjsjs","intent hxjjx");
                   intent.setClass(Name_Status.this , MainActivity.class);
                   startActivity(intent);
               }
    }
}

我甚至搜索并发现片段无法与其他片段或活动直接通信。但无法理解。这个弹出窗口是一个新的活动,而不是包含我片段的活动。那么如何在片段和其他活动之间进行交流呢?

希望我能很好地解释我的问题。请尝试用外行语言解释。

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

我建议您使用EventBus在片段和活动之间进行通信 https://github.com/greenrobot/EventBus

答案 2 :(得分:0)

解释了片段与其附加活动之间的通信here。从片段到活动,您只需使用getActivity来获取对活动的引用。从活动到片段,您可以使用findFragmentById(R.id.fragment_id)的{​​{1}}方法来引用要与之通信的片段。

活动之间的沟通是通过FragmentManager及其附加内容实现的here。您基本上将数据放在Intent中,并将其插入Bundle Ìntent

在您的情况下,您应首先让片段与活动进行通信,然后从此处开始使用putExtras()的新活动。