活动与片段之间的沟通

时间:2015-03-12 09:54:01

标签: java android android-fragments

大家好我正在开发一款应用程序,为了解释我的情况,我创建了一个简单的插图画家。当我点击另一个活动内的按钮时,我想将数据发送到片段。我使用bundle它给我nullpointerexception。我试图在另一个活动中使用方法,它再次给我错误。我如何提前感谢我将数据从Activity传递给Fragment。

这是我的代码。

编辑1:我想我解释错了。看看我上传的照片。当我点击白色按钮时,其他活动正在打开。当我在anotheractivity中键入一些文本并单击anotheractivity内的按钮,然后我想发送数据Fragment类。我希望我能够解释。感谢。

MainActivity

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn = (Button) findViewById(R.id.button2);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this,AnotherActivity.class);
                startActivity(i);

            }
        });
    }
}

AnotherActivity

public class AnotherActivity extends Activity {
    EditText et;
    Button btn;
    public String ets;
    FragmentClass myFragment = new FragmentClass();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.anotheractivity);
        btn = (Button) findViewById(R.id.button);
        et= (EditText) findViewById(R.id.editText);
        ets = et.getText().toString();
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                myFragment.Test(ets);

            }
        });
    }
}

片段

public class FragmentClass extends Fragment {
    TextView tv;
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment,container,false);
        tv = (TextView)v.findViewById(R.id.textView);

        return v;
    }


    public void Test(String name){
       Toast.makeText(getActivity(),name,Toast.LENGTH_SHORT).show();
    }
}

enter image description here

3 个答案:

答案 0 :(得分:2)

你可以在Bundle中放入不同的数据(我在下面的例子中传递了一个对象和一个字符串),也使用了FragmentManager和FragmentTransaction。在你的onClick in AnotherActivity中试试这样的东西:

            Bundle bundle = new Bundle();
            bundle.putParcelable("SomeObject", obj);
            bundle.putString("attribute", "some string value");
            otf.setArguments(bundle);

            fm = getFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();
            ft.add(R.id.container, myFragment, "MYFRAGMENT_NAME");
            ft.addToBackStack("MYFRAGMENT_NAME");
            ft.commit();

然后在新片段中使用getArguments()从Bundle获取数据。

答案 1 :(得分:2)

这是在Activity和Fragment

之间进行通信的最佳做法
public class TestFragment extends Fragment {

    private static final String ATAG = "atag";

    public static TestFragment getFragment(int value){
        TestFragment fragment = new TestFragment();
        Bundle bundle = new Bundle();
        bundle.putInt(ATAG, 100);
        fragment.setArguments(bundle);

        return fragment;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View view  = inflater.inflate(R.layout.layout_fragment, container,false);
        Bundle  b = getArguments();
            if(b!= null)
                YOUR DATA = b.getInt(ATAG);
        return view;
    }
}

活动:

public class MainActivity extends Activity{

    private static final String FOO = "foofragment";

    TestFragment newFragment;
    Button mButton;

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

        if(savedInstanceState == null){
            newFragment = TestFragment.getFragment(100);    
        }else {
            newFragment = (TestFragment) getFragmentManager().findFragmentByTag(FOO);
        }

        mButton.setOnClickListener(new OnClickListener() {
            FragmentManager manager = getFragmentManager();     
            FragmentTransaction transaction = manager.beginTransaction();   
            transaction.add(R.id.container, newFragment, FOO);          
            transaction.commit();
        }
    }
}

答案 2 :(得分:2)

此页面上的其他答案都包含您完全理解“活动和碎片”如何工作后可以使用的答案部分,但这听起来好像您还没有理解它们。

有许多好的资源,包括书籍和网站,你可以学习,但这里有一些我怀疑会绊倒你的基础知识:

  • 在任何给定时间内只有一个活动处于活动状态。

  • 活动有一个生命周期' - 一系列状态,从完全不活动到完全活动,以及在达到每个状态时调用的标准方法。

  • 必须将片段附加到活动。

  • 碎片的活动生命周期类似于(但不完全相同)活动。

  • 您无法安全地从另一个Activity调用一个Activity中的方法。如果要在两个活动之间传递数据,通常通过Intent进行。

  • 您无法直接在活动或片段与另一个活动中的其他活动或片段之间进行通信。如果从您的问题中看出,您希望将来自Activity的数据传递给另一个Activity中的Fragment,则必须将数据传递给Intent中的另一个Activity,然后让该Activity将其传递给它。 s片段在生命周期的适当位置。