Android 从选项卡式活动中的片段更改FloatingActionButton

Android 从选项卡式活动中的片段更改FloatingActionButton,android,android-fragments,floating-action-button,Android,Android Fragments,Floating Action Button,你好吗? 我是android编程新手。我正面临一个我试图处理的问题。但是,我不能。 我创建了一个新项目。选项卡式活动 我已经更改了它的一些设置。 对于每个选项卡,我创建一个片段。 我在MainActivity布局中保留了默认的FloatingAction按钮。 我试图从一块碎片上找到它 出现了一个错误。 以下是我的主要活动课程: public class MainActivity extends AppCompatActivity { private SectionsPagerAdapter m

你好吗? 我是android编程新手。我正面临一个我试图处理的问题。但是,我不能。 我创建了一个新项目。选项卡式活动

我已经更改了它的一些设置。 对于每个选项卡,我创建一个片段。 我在MainActivity布局中保留了默认的FloatingAction按钮。 我试图从一块碎片上找到它

出现了一个错误。 以下是我的主要活动课程:

public class MainActivity extends AppCompatActivity {
private SectionsPagerAdapter mSectionsPagerAdapter;
private ViewPager mViewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    // Create the adapter that will return a fragment for each of the three
    // primary sections of the activity.
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
    mViewPager = (ViewPager) findViewById(R.id.container);
    mViewPager.setAdapter(mSectionsPagerAdapter);

    TabLayout tabLayout = (TabLayout) findViewById(R.id.Main_FAB);

    mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager));


}

public class SectionsPagerAdapter extends FragmentPagerAdapter {
    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position)
        {
            case 0 : Summary summary = new Summary(); return summary ;
            case 1 : Expense_items expenseItems = new Expense_items(); return expenseItems;
            case 2 : Linage_items linage_items= new Linage_items(); return linage_items;
            default: return null;
        }
    }

    @Override
    public int getCount() {
        // Show 3 total pages.
        return 3;
    }
}
}
我的总结如下:

public class Summary extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_summary, container, false);
    TextView summary_text = (TextView) rootView.findViewById(R.id.summary_text);
    summary_text.setText("You are in Summary Fragment Fragment");
    FloatingActionButton myFB  = (FloatingActionButton) rootView.findViewById(R.id.fab);

    return rootView;
}
}
    protected void animateFab(final int position) {
    final FloatingActionButton fab = findViewById(R.id.Main_FAB);
    fab.clearAnimation();

    // Scale down animation
    ScaleAnimation shrink = new ScaleAnimation(1f, 0.1f, 1f, 0.1f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
    shrink.setDuration(100);     // animation duration in milliseconds
    shrink.setInterpolator(new AccelerateInterpolator());
    shrink.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {

        }

        @Override
        public void onAnimationEnd(Animation animation) {
            // Change FAB color and icon
            fab.setBackgroundTintList(ContextCompat.getColorStateList(getApplicationContext(), colorIntArray[position]));
            fab.setImageDrawable(ContextCompat.getDrawable(getApplicationContext(), iconIntArray[position]));

            // Rotate Animation
            Animation rotate = new RotateAnimation(60.0f, 0.0f,
                    Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
                    0.5f);
            rotate.setDuration(150);
            rotate.setInterpolator(new DecelerateInterpolator());

            // Scale up animation
            ScaleAnimation expand = new ScaleAnimation(0.1f, 1f, 0.1f, 1f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
            expand.setDuration(150);     // animation duration in milliseconds
            expand.setInterpolator(new DecelerateInterpolator());

            // Add both animations to animation state
            AnimationSet s = new AnimationSet(false); //false means don't share interpolators
            s.addAnimation(rotate);
            s.addAnimation(expand);
            fab.startAnimation(s);
        }

        @Override
        public void onAnimationRepeat(Animation animation) {

        }
    });
    fab.startAnimation(shrink);
}
在我的MainActivity布局中,我创建了FloatingAction按钮,如下所示:

<android.support.design.widget.FloatingActionButton
    android:id="@+id/Main_FAB"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="end|bottom"
    android:layout_margin="@dimen/fab_margin"
    app:srcCompat="@android:drawable/ic_dialog_email" />


我不想在片段中创建FloatingActionButton的原因是我不想更改它在布局中的位置

从片段中,您可以通过

(MainActivity) getActivity()
在MainActivity中,您可以创建如下函数

public void actionA()
从片段A中调用它

((MainActivity) getActivity()).actionA()

来自碎片B等的操作B

首先,我可以在MainActivity的XML文件中看到,您的工厂id是“Main_fab” 不是你在这里写的“fab”

    FloatingActionButton myFB  = (FloatingActionButton) rootView.findViewById(R.id.fab);
此外,您的晶圆厂处于活动中,而不是片段中,所以要访问它,您需要在 fragment类是onActivityCreated方法,在这里您可以获取FloatingActionButton的实例。

这是一个例子,它应该为您工作。


您必须处理MainActivity中的浮动按钮,该按钮正在处理所有片段。 在日常活动中尝试这样做:

         myFab = (FloatingActionButton) findViewById(R.id.Main_FAB);
    myFab.setImageDrawable(ContextCompat.getDrawable(getApplicationContext(), iconIntArray[0]));

    myFab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            int position = tabLayout.getSelectedTabPosition();

            switch (position) {
                case 0:
                    myFab.setImageDrawable(ContextCompat.getDrawable(MainActivity.this, iconIntArray[0]));

                    intent = new Intent(MainActivity.this,
                            EnterExpensesActivity.class);
                    intent.putExtra("USER_ID",USER_ID);
                    intent.putExtra("FRAGMENT",0);

                    intent.putExtra("TITLE",getResources().getString(R.string.Enter_Expense_title));
                    intent.putExtra("FILED",getResources().getString(R.string.Enter_Expense_text));
                    startActivity(intent);

                    break;
                case 1:
                    myFab.setImageDrawable(ContextCompat.getDrawable(MainActivity.this, iconIntArray[position]));
                    intent = new Intent(MainActivity.this,
                            Enter_E_L_Items.class);
                    intent.putExtra("USER_ID",USER_ID);
                    intent.putExtra("FRAGMENT",0);

                    intent.putExtra("TITLE",getResources().getString(R.string.Enter_Expense_title));
                    intent.putExtra("FILED",getResources().getString(R.string.Enter_Expense_text));

                    startActivity(intent);
                    /*
                    Snackbar.make(view, "Expenses ", Snackbar.LENGTH_LONG)
                            .setAction("Action", null).show();*/
                break;
                case 2:
                    myFab.setImageDrawable(ContextCompat.getDrawable(MainActivity.this, iconIntArray[position]));
                    intent = new Intent(MainActivity.this,
                            Enter_E_L_Items.class);
                    intent.putExtra("USER_ID",USER_ID);
                    intent.putExtra("FRAGMENT",1);
                    intent.putExtra("TITLE",getResources().getString(R.string.Enter_Liange_title));
                    intent.putExtra("FILED",getResources().getString(R.string.Enter_Linage_text));

                    startActivity(intent);
                    /*
                    Snackbar.make(view, "Linage ", Snackbar.LENGTH_LONG)
                            .setAction("Action", null).show();*/
                    break;
            }
        }
    });
我假设您正在使用默认选项卡活动

可以将动画更改并设置为浮动按钮,如下所示:

    tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewpager.setCurrentItem(tab.getPosition());
            animateFab(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });
    setupTabIcons();

}
我创建了animateFab方法,如下所示:

public class Summary extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_summary, container, false);
    TextView summary_text = (TextView) rootView.findViewById(R.id.summary_text);
    summary_text.setText("You are in Summary Fragment Fragment");
    FloatingActionButton myFB  = (FloatingActionButton) rootView.findViewById(R.id.fab);

    return rootView;
}
}
    protected void animateFab(final int position) {
    final FloatingActionButton fab = findViewById(R.id.Main_FAB);
    fab.clearAnimation();

    // Scale down animation
    ScaleAnimation shrink = new ScaleAnimation(1f, 0.1f, 1f, 0.1f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
    shrink.setDuration(100);     // animation duration in milliseconds
    shrink.setInterpolator(new AccelerateInterpolator());
    shrink.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {

        }

        @Override
        public void onAnimationEnd(Animation animation) {
            // Change FAB color and icon
            fab.setBackgroundTintList(ContextCompat.getColorStateList(getApplicationContext(), colorIntArray[position]));
            fab.setImageDrawable(ContextCompat.getDrawable(getApplicationContext(), iconIntArray[position]));

            // Rotate Animation
            Animation rotate = new RotateAnimation(60.0f, 0.0f,
                    Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
                    0.5f);
            rotate.setDuration(150);
            rotate.setInterpolator(new DecelerateInterpolator());

            // Scale up animation
            ScaleAnimation expand = new ScaleAnimation(0.1f, 1f, 0.1f, 1f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
            expand.setDuration(150);     // animation duration in milliseconds
            expand.setInterpolator(new DecelerateInterpolator());

            // Add both animations to animation state
            AnimationSet s = new AnimationSet(false); //false means don't share interpolators
            s.addAnimation(rotate);
            s.addAnimation(expand);
            fab.startAnimation(s);
        }

        @Override
        public void onAnimationRepeat(Animation animation) {

        }
    });
    fab.startAnimation(shrink);
}

我的选项卡式活动有三个片段。我在每个片段中复制了你的代码。我在onActivityCreated中创建了一个Onclick侦听器。当我在片段1中时,片段2的文本出现。当我在2时,碎片1的文本出现。那么,我做错了什么?我不知道我该如何帮助你,因为我不确定你希望通过这个选项卡式活动和fab获得什么样的结果,所以请首先让我知道这一点。很抱歉,我没有及时回复。我有三个标签。对于每个选项卡,我想分别控制浮动按钮。因此,每个选项卡都构建在一个片段上。我想完全控制浮动按钮。例如在选项卡1中:浮动按钮背景图像为“调用”。操作是转到电话拨号。表2。背景图像是“msg”。操作是转到消息。等等我希望我说得很清楚。因此,您希望fab在每个片段上有不同的行为。这正是我想要的方法。SetImageDrawable此方法应该更改浮动按钮的图标。如果你愿意,你可以像我一样实施。我将编辑答案。