【问题标题】:Reference to elements of fragment from activity从活动中引用片段的元素
【发布时间】:2016-04-01 23:26:35
【问题描述】:

是否可以引用片段的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();

        }
    });

【问题讨论】:

  • 你是怎么尝试的?你能放一些代码吗?
  • 您为什么要这样做?您可以随时为视图膨胀并为其提供片段的 xml,然后在该视图中找到该对象,例如 view.findViewById(R.id.myButton),但我看不出重点,您为什么不做您需要在片段中做的事情?
  • 你应该阅读communication between Fragments上的文档
  • 我猜你只能从你正在使用的布局中获得一些参考(非空),并在当前活动中添加 setContentView()UPDATED 我觉得你可以试试inthecheesefactory.com/blog/… 可以吗?
  • Fragment 中使用getter,并以通常的方式与Fragment 通信:getFragmentManager().findFragmentById(R.id.fragment_container).getButtonOrAnyOtherView()

标签: android android-fragments


【解决方案1】:

要删除Fragment,通过按所述片段内的按钮。

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

我还没有对此进行测试,所以它可能是不可能的......但你可以尝试从这个片段内部访问FragmentManager,然后让它自行删除。在这种情况下,您可以在 onClick() 中调用它。您可能需要在此处将getActivity() 放在getFragmentManager() 前面。

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

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

将上述逻辑放在Activity 附加到Fragment 的类中的公共方法中,然后在Fragment onClick() 中访问它,如下所示:

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

方法三(Fragment 与其Activity 通信的推荐方式)

使用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 从 Fragment 到 Activity 进行通信

【讨论】:

  • 什么意思 mListener = (OnFragmentInteractionListener) 活动; ?为什么在使用 onAttach(Activity activity) 时不推荐使用 onAttach?
  • @PavelPalei 您可能想使用public void onAttach(Context context) 而不是public void onAttach(Activity activity)。还有更多内容here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 2016-11-30
相关资源
最近更新 更多