从片段访问主要活动FloatingActionButton

时间:2019-05-27 08:18:04

标签: android android-layout android-fragments

我有一个包含3个片段的活动。每个片段都必须有一个带有不同图标的FAB动作。 FAB在主要活动布局上定义。现在我看到我无法从片段访问它。我该怎么办?

这是我的代码: main_activity布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <android.support.v4.view.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        app:layout_constraintBottom_toTopOf="parent"
        app:layout_constraintTop_toBottomOf="parent"
        tools:layout_editor_absoluteX="16dp">


        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabGravity="fill"
            app:tabMode="fixed" />
    </android.support.v4.view.ViewPager>


    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="24dp"
        android:src="@android:drawable/ic_dialog_email"
        android:visibility="visible"
        app:layout_constraintBottom_toTopOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />

</android.support.constraint.ConstraintLayout>

我的片段布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorBackgroundFragment">

    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/contact_recycleview">

    </android.support.v7.widget.RecyclerView>

</LinearLayout>

扩大片段:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    v= inflater.inflate(R.layout.filters_fragment,container,false);

    myrecyclerview = (RecyclerView) v.findViewById(R.id.contact_recycleview);
    recyclerAdapter = new RecyclerViewAdapterCall(getContext(), lstCall);
    myrecyclerview.setLayoutManager(new LinearLayoutManager((getActivity())));
    myrecyclerview.addItemDecoration(new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL));
    myrecyclerview.setAdapter(recyclerAdapter);

    return v;
}

所以在这里我想将图标更改为一个动作,怎么做?

5 个答案:

答案 0 :(得分:2)

Step 1 create interface
  public interface FabButtonClick {
         void onFabClicked();
void onFabClickedTwo()

    }
  

第2步:内部活动

 FabButtonClick fabButtonClick ;

inside `oncreate()` of activity

    fab.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {


switch(mViewPager.getCurrentItem()){
case 0: 
fabButtonClick.onFabClicked()
break;
case 1: 
fabButtonClick.onFabClickedTwo()
break;
etc
}

                }
            });
  

仅在活动范围内

private void setListener(FabButtonClick interface){
    fabButtonClick =interface;
}


fragment implement FabButtonClick 
  

onViewCreated内部片段

((YOUR_ACTIVITY_NAME)getActivity()).setListener(this)
  接口中的

覆盖方法现在可以让您处理fab中的点击   片段

答案 1 :(得分:0)

从Fragment调用

 Objects.requireNonNull(getActivity()).someOperationOnFab();

其中MainActivity中定义了someOperationOnFab()

 public void someOperationOnFab(){
     yourFab. blah
}  

答案 2 :(得分:0)

将“浮动操作”按钮添加到片段中。将其添加到“片段”布局中。这样,将使方法更简单,更清晰。

答案 3 :(得分:0)

Android开发人员指南建议采用以下方式进行ActivityFragment通信。

Fragment被监听者访问ActivityActivityFragment的访问getSupportFragmentManager().getFragments()

因此,您有两种使用fab的方法。

首先,直接访问fab中的Fragment

class MyFragment extends Fragment {
    MyFragmentListener listener;

    void myFunction() {
        FloatingActionButton fab = listener.getFab();
        ...
    }
}

interface MyFragmentListener {
    FloatingActionButton getFab();
}

class MyActivity extends AppCompatActivity implements MyFragmentListener {
    FloationActionButton fab;

    @Override
    FloationActionButton getFab() {
        return fab;
    }

    @Override
    void onAttachFragment(Fragment fragment) {
        super.onAttachFragment(fragment);
        if(fragment instanceof MyFragment) {
            ((MyFragment) fragment).listener = this;
        }
    }
}

第二,单击Fragment时调用fab的功能

//In Activity
fab.setOnClickListener(new OnClickListener() {
    for(fragment : getSupportFragmentManager().getFragments()) {
        if(fragment instanceof MyFragment) {
            ((MyFragment) fragment).someFunction();
        }
    }
});

答案 4 :(得分:0)

这就是我在片段中使用MainActivity浮动操作按钮的方式...

在MainActivity.java中:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
...

    MyViewModel mViewModel = new ViewModelProvider(this).get(MyViewModel.class);
    FloatingActionButton fab = findViewById(R.id.fab);
    if (fab != null) mViewModel.setFab(fab);
}

在MyViewModel.java中:

public class MyViewModel extends ViewModel {
    private FloatingActionButton mFab;

    public void setFab(final FloatingActionButton fab) {
        mFab = fab;
    }
    public FloatingActionButton getFab() {
        return mFab; 
    }
    public void listenToFab(View.OnClickListener ocl) { 
        if (ocl != null) 
            mFab.setOnClickListener(ocl); 
    }
}

然后在每个片段中实现View.OnClickListener:

public class HomeFragment extends Fragment implements View.OnClickListener {

然后调用ViewModel的'listenToFab'方法,并将片段作为侦听器参数传入

@Override
public void onViewCreated(@NonNull final View view, @Nullable final Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    mViewModel = new ViewModelProvider(requireActivity()).get(MyViewModel.class);
    mViewModel.listenToFab(this);
}

请注意,在MainActivity.java中,此行是:

MyViewModel mViewModel = new ViewModelProvider(this).get(MyViewModel.class);
                                               ^^^^

在片段中此行是:

mViewModel = new ViewModelProvider(requireActivity()).get(MyViewModel.class);
                                   ^^^^^^^^^^^^^^^^^

这样,每个片段都会获得与在MainActivity中设置晶圆厂相同的ViewModel。

(已编辑,以纠正可能引起误解的变量名称)