从活动引用片段的元素

时间:2016-04-01 14:08:46

标签: android android-fragments

可以引用片段的xml布局中定义的元素(如按钮)并在另一个活动中使用它吗?

我尝试这样做,但是有空对象引用。

fragment_date_picker.xml

<TimePicker
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/timePicker"
    android:layout_gravity="center_horizontal|top" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="ok"
    android:id="@+id/bt_ok"
    android:layout_gravity="center" />

MainActivity.java

btPickTime=(Button)findViewById(R.id.bt_pickTime);
    AlarmManager alarmManager=(AlarmManager)getSystemService(ALARM_SERVICE);
    final DatePickerFragment dp=new DatePickerFragment();

    btOk=(Button)findViewById(R.id.bt_ok);
    btOk.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            FragmentManager fm = getFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();
            ft.remove(dp);
            ft.commit();
        }
    });
    btPickTime.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            FragmentManager fm = getFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();
            ft.add(R.id.ll_main
                    ,dp);
            ft.commit();

        }
    });

2 个答案:

答案 0 :(得分:3)

要删除Fragment,请通过按钮按下所述片段。

方法一(可能是最简单的)

我还没有对此进行测试,因此可能无法实现...但您可以尝试从此片段中访问FragmentManager,然后将其自行删除。在这种情况下,您可以在onClick()内调用此内容。您可能需要在getActivity()前面放置getFragmentManager()

getFragmentManager().beginTransaction().remove(this).commit();

方法二(几乎一样简单,但做法不好)

将上述逻辑放在您Activity附加到的Fragment班级的公开方法中,并在Fragment onClick()内访问,如下所示:

((MyActivityName)getActivity()).nameOfPublicMethodToRemoveFragment();

方法三(FragmentActivity进行沟通的推荐方式

使用interface(从here拉出的示例):

    public class BlankFragment extends Fragment implements View.OnClickListener{

    private View rootView;
    private Button button;

    private OnFragmentInteractionListener mListener;

    public static BlankFragment newInstance() {
        return new BlankFragment();
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (OnFragmentInteractionListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

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

        rootView = inflater.inflate(R.layout.fragment_blank, container, false);
        button = (Button) rootView.findViewById(R.id.fragment_button);
        button.setOnClickListener(this);

        return rootView;
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    @Override
    public void onClick(View v) {
        mListener.onFragmentInteraction();
    }

    public interface OnFragmentInteractionListener {
        void onFragmentInteraction();
    }

}

主要活动

public class MainActivity extends AppCompatActivity implements BlankFragment.OnFragmentInteractionListener{

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

        if (getFragmentManager().findFragmentById(R.id.fragment_container) == null) {
            getFragmentManager()
                    .beginTransaction()
                    .add(R.id.fragment_container, BlankFragment.newInstance())
                    .commit();
        }
    }

    @Override
    public void onFragmentInteraction() {
        //Remove Fragment Here
    }
}

方法四(备选方案)

使用EventBus从片段与活动进行通信

答案 1 :(得分:-1)

您是否尝试将按钮声明为MainActivity中的变量,并在片段的OnCreate中设置其值?