Невозможно различить два фрагмента с событиями щелчка диаграммы - PullRequest
0 голосов
/ 05 июня 2019

Respected community, Please see the attached screenshot in which you'll be able to see the problem that I am dealing with. Я реализовал две круговые диаграммы в двух разных фрагментах. Всякий раз, когда я нажимаю на круговую диаграмму, она вызывает события щелчка второго фрагмента на обоих фрагментах.

Вот мой код MainActivity.java.

package longitude.com.anychart;

import android.content.res.Resources;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.os.Bundle;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;

import android.widget.TextView;

import com.anychart.chart.common.dataentry.DataEntry;
import com.anychart.chart.common.dataentry.ValueDataEntry;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    /**
     * The {@link android.support.v4.view.PagerAdapter} that will provide
     * fragments for each of the sections. We use a
     * {@link FragmentPagerAdapter} derivative, which will keep every
     * loaded fragment in memory. If this becomes too memory intensive, it
     * may be best to switch to a
     * {@link android.support.v4.app.FragmentStatePagerAdapter}.
     */


    /**
     * The {@link ViewPager} that will host the section contents.
     */
    private ViewPager mViewPager;
    private AccountDashboardAdapter mSectionsPagerAdapter;

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

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        // Create the adapter that will return a fragment for each of the three
        // primary sections of the activity.
        mViewPager = (ViewPager) findViewById(R.id.container);
        //mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

        ArrayList<DataEntry> dateData = new ArrayList<>();
        dateData.add(new ValueDataEntry("Apples", 123456));
        dateData.add(new ValueDataEntry("Pears", 852465));
        dateData.add(new ValueDataEntry("Bananas", 753159));
        dateData.add(new ValueDataEntry("Grapes", 963215));
        dateData.add(new ValueDataEntry("Oranges", 415263));


        ArrayList<DataEntry> collectorData = new ArrayList<>();
        collectorData.add(new ValueDataEntry("Applessssss", 6371664));
        collectorData.add(new ValueDataEntry("Pearsssss", 789622));
        collectorData.add(new ValueDataEntry("Bananasssss", 7216301));
        collectorData.add(new ValueDataEntry("Grapesssss", 1486621));
        collectorData.add(new ValueDataEntry("Orangesssss", 1200000));

        HashMap<String, ArrayList<DataEntry>> childData=new LinkedHashMap<>();

        childData.put("Apples",collectorData);
        childData.put("Pears",collectorData);
        childData.put("Bananas",collectorData);
        childData.put("Grapes",collectorData);
        childData.put("Oranges",collectorData);

        childData.put("Applessssss",dateData);
        childData.put("Pearsssss",dateData);
        childData.put("Bananasssss",dateData);
        childData.put("Grapesssss",dateData);
        childData.put("Orangesssss",dateData);


        mSectionsPagerAdapter = new AccountDashboardAdapter(getResources(), getSupportFragmentManager(), dateData, collectorData, childData);
        mViewPager.setOffscreenPageLimit(5);
        // Set up the ViewPager with the sections adapter.
        mViewPager.setAdapter(mSectionsPagerAdapter);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {
        /**
         * The fragment argument representing the section number for this
         * fragment.
         */
        private static final String ARG_SECTION_NUMBER = "section_number";

        public PlaceholderFragment() {
        }

        /**
         * Returns a new instance of this fragment for the given section
         * number.
         */
        public static PlaceholderFragment newInstance(int sectionNumber) {
            PlaceholderFragment fragment = new PlaceholderFragment();
            Bundle args = new Bundle();
            args.putInt(ARG_SECTION_NUMBER, sectionNumber);
            fragment.setArguments(args);
            return fragment;
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container, false);
            TextView textView = (TextView) rootView.findViewById(R.id.section_label);
            textView.setText(getString(R.string.section_format, getArguments().getInt(ARG_SECTION_NUMBER)));
            return rootView;
        }
    }

    /**
     * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
     * one of the sections/tabs/pages.
     */
    public class AccountDashboardAdapter extends FragmentStatePagerAdapter {

        private final List<DataEntry> collectorData;
        private final HashMap<String, ArrayList<DataEntry>> childData;
        SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();
        List<DataEntry> dateData;

        /**
         * Create pager adapter
         *
         * @param resources
         * @param fm
         * @param data
         * @param childData
         */
        public AccountDashboardAdapter(final Resources resources, FragmentManager fm, List<DataEntry> data, List<DataEntry> collectorData, HashMap<String, ArrayList<DataEntry>> childData) {
            super(fm);
            this.dateData = data;
            this.collectorData = collectorData;
            this.childData = childData;
        }


        @Override
        public Fragment getItem(int position) {
            final Fragment result;

            switch (position) {
                case 0:
                    // First Fragment of First Tab
                    //result = new DatewiseAccountDashboardFragment();
                    result = new fragment1();

                    Bundle bundle = new Bundle();
                    bundle.putSerializable("data", (Serializable) dateData);
                    bundle.putSerializable("childData", childData);
                    result.setArguments(bundle);


                    break;
                case 1:
                    // First Fragment of Second Tab
                    //result = new CollectorwiseAccountDashboardFragment();
                    result = new fragment2();

                    Bundle bundle1 = new Bundle();
                    bundle1.putSerializable("data", (Serializable) collectorData);
                    bundle1.putSerializable("childData", childData);
                    result.setArguments(bundle1);

                    break;
                case 2:
                    // First Fragment of Second Tab
                    //result = new CollectorwiseAccountDashboardFragment();
                    result = new fragment1();

                    Bundle bundle2 = new Bundle();
                    bundle2.putSerializable("data", (Serializable) dateData);
                    bundle2.putSerializable("childData", childData);
                    result.setArguments(bundle2);
                    break;
                default:
                    result = null;
                    break;
            }


            return result;
        }

        @Override
        public int getCount() {
            return 2;
        }

        @Override
        public CharSequence getPageTitle(final int position) {
            switch (position) {
                case 0:
                    return "DATEWISE";
                case 1:
                    return "COLLECTORWISE";
                default:
                    return null;
            }
        }

        /**
         * On each Fragment instantiation we are saving the reference of that Fragment in a Map
         * It will help us to retrieve the Fragment by position
         *
         * @param container
         * @param position
         * @return
         */
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            Fragment fragment = (Fragment) super.instantiateItem(container, position);
            registeredFragments.put(position, fragment);
            return fragment;
        }

        /**
         * Remove the saved reference from our Map on the Fragment destroy
         *
         * @param container
         * @param position
         * @param object
         */
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            registeredFragments.remove(position);
            super.destroyItem(container, position, object);
        }


        /**
         * Get the Fragment by position
         *
         * @param position tab position of the fragment
         * @return
         */
        public Fragment getRegisteredFragment(int position) {
            return registeredFragments.get(position);
        }
    }
}

Мой первый фрагмент Fraj1.java

package longitude.com.anychart;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import com.anychart.APIlib;
import com.anychart.AnyChart;
import com.anychart.AnyChartView;
import com.anychart.chart.common.dataentry.DataEntry;
import com.anychart.chart.common.listener.Event;
import com.anychart.chart.common.listener.ListenersInterface;
import com.anychart.charts.Pie;
import com.anychart.enums.Align;
import com.anychart.enums.LegendLayout;

import java.util.List;

public class Fragment1 extends Fragment {


    private AnyChartView anyChartView;
    private List<DataEntry> data;
    private Pie pie;

    public Fragment1() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(false);

        data = (List<DataEntry>) getArguments().getSerializable("data");
        //childData = (HashMap<String, ArrayList<DataEntry>>) getArguments().getSerializable("childData");
        getArguments().remove("data");
        getArguments().remove("childData");

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment1, container, false);
        anyChartView = rootView.findViewById(R.id.any_chart_view1);
        anyChartView.setProgressBar(rootView.findViewById(R.id.progress_bar1));
        showChart(anyChartView, data);
        return rootView;
    }

    private void showChart(AnyChartView anyChartView, List<DataEntry> data) {

        APIlib.getInstance().setActiveAnyChartView(anyChartView);
        pie = AnyChart.pie();

        pie.data(data);
        pie.title("1st Anychart Title");
        //pie.labels().position("outside");

        pie.innerRadius(50);

        pie.legend().title().enabled(true);
        pie.legend().title(false);

        pie.legend()
                .position("center-bottom")
                .itemsLayout(LegendLayout.HORIZONTAL_EXPANDABLE)
                .align(Align.CENTER);

        //pie.fill("aquastyle");

        pie.labels().format("{%x}\\n{%value}");


        anyChartView.setChart(pie);

        pie.tooltip(false);

        pie.setOnClickListener(new ListenersInterface.OnClickListener(new String[]{"x", "value"}) {
            @Override
            public void onClick(Event event) {
                Toast.makeText(getActivity(), "Fragment1==>" + event.getData().get("x") + ":" + event.getData().get("value"), Toast.LENGTH_SHORT).show();
            }
        });

    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
    }

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

    @Override
    public void onStop() {
        super.onStop();
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    }
}

Мой второй фрагмент 2.java код

package longitude.com.anychart;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;

import com.anychart.APIlib;
import com.anychart.AnyChart;
import com.anychart.AnyChartView;
import com.anychart.chart.common.dataentry.DataEntry;
import com.anychart.chart.common.listener.Event;
import com.anychart.chart.common.listener.ListenersInterface;
import com.anychart.charts.Pie;
import com.anychart.enums.Align;
import com.anychart.enums.LegendLayout;

import java.util.List;

public class Fragment2 extends Fragment {


    private AnyChartView anyChartView;
    private List<DataEntry> data;
    private Pie pie;

    public Fragment2() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(false);

        data = (List<DataEntry>) getArguments().getSerializable("data");
        //childData = (HashMap<String, ArrayList<DataEntry>>) getArguments().getSerializable("childData");
        getArguments().remove("data");
        getArguments().remove("childData");

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment1, container, false);
        anyChartView = rootView.findViewById(R.id.any_chart_view1);
        anyChartView.setProgressBar(rootView.findViewById(R.id.progress_bar1));
        showChart(anyChartView, data);
        return rootView;
    }

    private void showChart(AnyChartView anyChartView, List<DataEntry> data) {

        APIlib.getInstance().setActiveAnyChartView(anyChartView);
        pie = AnyChart.pie();

        pie.data(data);

            pie.title("2nd Anychart Title");

        //pie.labels().position("outside");

        pie.innerRadius(50);

        pie.legend().title().enabled(true);
        pie.legend().title(false);

        pie.legend()
                .position("center-bottom")
                .itemsLayout(LegendLayout.HORIZONTAL_EXPANDABLE)
                .align(Align.CENTER);

        //pie.fill("aquastyle");

        pie.labels().format("{%x}\\n{%value}");


        anyChartView.setChart(pie);

        pie.tooltip(false);

        pie.setOnClickListener(new ListenersInterface.OnClickListener(new String[]{"x", "value"}) {
            @Override
            public void onClick(Event event) {
                Toast.makeText(getActivity(), "Fragment2==>"+event.getData().get("x") + ":" + event.getData().get("value"), Toast.LENGTH_SHORT).show();
            }
        });

    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
    }

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

    @Override
    public void onStop() {
        super.onStop();
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    }
}

fragment1.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <Button
        android:id="@+id/btn_back"
        android:enabled="false"
        android:layout_width="60dp"
        android:layout_height="40dp"
        android:text="BACK" />

    <com.anychart.AnyChartView
        android:id="@+id/any_chart_view1"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <ProgressBar
        android:id="@+id/progress_bar1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" />

</RelativeLayout>

Вот моя кодовая ссылка: https://drive.google.com/file/d/1YnIL1fE52W_Gy4yuc2rYb4fh4Y1hGNuG/view?usp=sharing

1 Ответ

0 голосов
/ 07 июня 2019

К сожалению, сейчас мы не знаем, что именно происходит с диспетчеризацией событий во фрагментах. Но я хотел бы обратить ваше внимание на то, что существует возможный обходной путь. Щелчок на диаграмме возвращает правильное имя и значение точки. Только название фрагмента неверно. Имя жестко закодировано в обработчике события щелчка. Так что если имя фрагмента не требуется в выводе, вы можете просто удалить его. Если имя требуется, вы можете применить конкретный идентификатор к фрагменту, а затем получить этот идентификатор из представления активного фрагмента. Это должно решить проблему как временное решение.

...