简体   繁体   中英

Android : Issue in back from a pop up window

I've used following code to create a pie chart in a pop up window in a fragment.

mChartView = ChartFactory.getPieChartView(getActivity(), distributionSeries, defaultRenderer);
    popupWindow = new PopupWindow(mChartView, LayoutParams.FILL_PARENT,  
                                 LayoutParams.FILL_PARENT, false);
                        popupWindow.setOutsideTouchable(true);
                        popupWindow.showAsDropDown(mChartView, 50, 50);
                        popupWindow.setTouchInterceptor(new OnTouchListener() {

                            @Override
                            public boolean onTouch(View v, MotionEvent event) {
                                // TODO Auto-generated method stub
                                if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
                                    popupWindow.dismiss();

                                }
                                return false;
                            }
                        });

This is my full code.

public class MainActivity extends SherlockFragmentActivity {
private SectionsPagerAdapter mSectionsPagerAdapter;
private ViewPager mViewPager;
private Boolean is3g, isWifi;
private int networkType;
private TelephonyManager telephonyInfo;
static Integer[] pics = { R.drawable.route, R.drawable.two,
        R.drawable.three, R.drawable.four };
static ImageAdapter imgAdp;
private static PopupWindow popupWindow = null;


@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
}

@Override
public void onBackPressed() {
    if(popupWindow != null) {
         popupWindow.dismiss();  
    } else {  
         super.onBackPressed();
    }

}

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getSupportMenuInflater().inflate(R.menu.banner, menu);
    return true;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    imgAdp = new ImageAdapter(MainActivity.this);

    mSectionsPagerAdapter = new SectionsPagerAdapter(
            getSupportFragmentManager());
    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setAdapter(mSectionsPagerAdapter);

    ActionBar actionBar = getActionBar();
    actionBar.setDisplayShowTitleEnabled(true);

    // network connection manager
    ConnectivityManager manager = (ConnectivityManager) getSystemService(LoginActivity.CONNECTIVITY_SERVICE);
    is3g = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)
            .isConnectedOrConnecting();
    isWifi = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
            .isConnectedOrConnecting();

    telephonyInfo = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    networkType = telephonyInfo.getNetworkType();
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.menu_accept:
        Intent sales = new Intent(getApplicationContext(),
                SalesRouteFragment.class);
        Intent showContent = new Intent(getApplicationContext(),
                DownloadUploadPagerActivity.class);
        Bundle bundle = new Bundle();
        bundle.putString("name", "MainActivity");
        if (is3g || isWifi) {
            Toast.makeText(MainActivity.this, "WIFI/3G is availabe ",
                    Toast.LENGTH_LONG).show();
            showContent.putExtras(bundle);
            startActivity(showContent);
            finish();
            return true;

        } else if (networkType == TelephonyManager.NETWORK_TYPE_GPRS) {
            Toast.makeText(MainActivity.this, "GPRS is availabe ",
                    Toast.LENGTH_LONG).show();
            showContent.putExtras(bundle);
            startActivity(showContent);
            finish();
            return true;
        } else {
            Toast.makeText(MainActivity.this,
                    "There is no internet connectivity", Toast.LENGTH_LONG)
                    .show();
            sales.putExtras(bundle);
            startActivity(sales);
            finish();
            return true;
        }
    case R.id.ac_exit:
        AlertDialog.Builder exitCon = new AlertDialog.Builder(
                MainActivity.this);
        exitCon.setMessage("Do you want to Exit? ");
        exitCon.setCancelable(false);
        exitCon.setPositiveButton("Yes",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        dialog.dismiss();
                        try {
                            removePrefrence();
                            Intent exit = new Intent(MainActivity.this,
                                    LoginActivity.class);
                            Bundle bdle = new Bundle();
                            bdle.putString("name", "LoginActivity");
                            exit.putExtras(bdle);
                            startActivity(exit);
                            finish();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });

        exitCon.setNegativeButton("No",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        dialog.cancel();
                    }
                });
        exitCon.setTitle("Exit...");
        exitCon.show();

        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

// Exit
public void removePrefrence() {
    SharedPreferences myLogPrefs = MainActivity.this.getSharedPreferences(
            "myLogedPrefs", MODE_PRIVATE);
    SharedPreferences myRoutes = MainActivity.this.getSharedPreferences(
            "myRoute", MODE_PRIVATE);
    Date date = new Date();
    DateFormat dateOnlyFormatter = new SimpleDateFormat("yyyy-MM-dd");
    String strDateOnly = dateOnlyFormatter.format(date);

    String loggedDate = myLogPrefs.getString("LoggedDate", "");
    if (loggedDate.equals(strDateOnly)) {

    } else {
        SharedPreferences.Editor prefsEditor = myLogPrefs.edit();
        myLogPrefs.getAll();
        prefsEditor.remove("myLogedPrefs");
        prefsEditor.clear();
        prefsEditor.commit();

        SharedPreferences.Editor routePrefence = myRoutes.edit();
        myRoutes.getAll();
        routePrefence.remove("myRoute");
        routePrefence.clear();
        routePrefence.commit();
    }
}

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

    @Override
    public CharSequence getPageTitle(int position) {
        Locale l = Locale.getDefault();
        switch (position) {
        case 0:
            return getString(R.string.title_section1).toUpperCase(l);
        case 1:
            return getString(R.string.title_section2).toUpperCase(l);

        }
        return null;
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
        case 0:
            Fragment fragment = new DummySectionFragment();
            Bundle args = new Bundle();
            args.putInt(DummySectionFragment.ARG_SECTION_NUMBER,
                    position + 1);
            fragment.setArguments(args);
            return fragment;
        case 1:
            Fragment fment1 = new DummySectionFragment();
            Bundle args1 = new Bundle();
            args1.putInt(DummySectionFragment.ARG_SECTION_NUMBER,
                    position + 1);
            fment1.setArguments(args1);
            return fment1;
        case 2:
        case 3:
        default:
            Fragment fment = new DummySectionFragment();
            Bundle ars = new Bundle();
            ars.putInt(DummySectionFragment.ARG_SECTION_NUMBER,
                    position + 1);
            fment.setArguments(ars);
            return fment;
        }
    }

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

public static class LaunchpadSectionFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = null;
        Intent intent = new Intent(getActivity(), SalesRouteFragment.class);
        startActivity(intent);
        return rootView;
    }
}

public static class DummySectionFragment extends Fragment {
    public static final String ARG_SECTION_NUMBER = "section_number";
    private String strBusinessUnit, strExeCode;
    private Date date = new Date();
    private DateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd");
    private String sysDate = dateFormatter.format(date);
    private ArrayList<XAPeriodEndDate> currentPerid_Yr = new ArrayList<XAPeriodEndDate>();
    private int currentYear;
    private int currentPeriod;
    private TextView tvAsAt, tvTarget, tvAchieved, tvBalAchieve, tvBalDays,
            tvPlanedRoute, tvOutlet, tvTargetVal;
    private Button btnpieChart;
    private ProgressBar progressBar;
    private ArrayList<WMTargetExecAchieveSummary> lstExeSummaryData;
    private DecimalFormat deciFormatter = new DecimalFormat("#.00");
    private double target, bal_toAchieve, achieved, pertageAchieved,
            dayTargetVal;
    private String strStartDate, strEndDate;
    private int balDays = 1, outletCount = 0;
    private TreeMap<String, String> todayRouteMap = new TreeMap<String, String>();
    private String todayRouteCode;
    private HashMap<String, Double> chartDataMap = new HashMap<String, Double>();
    private ArrayList<String> lstBrandNames = new ArrayList<String>();
    private ArrayList<Double> lstAchievedVals = new ArrayList<Double>();
    private GraphicalView mChartView = null;
    private LinearLayout chart_container;
    private View rootView = null;

    public DummySectionFragment() {
    }

    @Override
    public View onCreateView(final LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        //View rootView = null;
        if (getArguments().getInt(ARG_SECTION_NUMBER) == 1) {
            rootView = inflater.inflate(R.layout.fragment_main_dummy,
                    container, false);

            tvAsAt = (TextView) rootView.findViewById(R.id.tvAsAt);
            tvAchieved = (TextView) rootView.findViewById(R.id.tvAchieved);
            tvBalAchieve = (TextView) rootView.findViewById(R.id.tvBalAchieve);
            tvBalDays = (TextView) rootView.findViewById(R.id.tvBalDays);
            tvOutlet = (TextView) rootView.findViewById(R.id.tvOutlet);
            tvPlanedRoute = (TextView) rootView.findViewById(R.id.tvPlanedRoute);
            tvTarget = (TextView) rootView.findViewById(R.id.tvTarget);
            tvTargetVal = (TextView) rootView.findViewById(R.id.tvTargetVal);
            btnpieChart = (Button) rootView.findViewById(R.id.btnpieChart);
            progressBar = (ProgressBar) rootView.findViewById(R.id.progressBar);

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

                    SelectDBAdapter selectDBAdapter = SelectDBAdapter
                            .getDBAdapterInstance(getActivity());
                    try {
                        selectDBAdapter.openDataBase();
                        chartDataMap = selectDBAdapter
                                .getPieChartData(strBusinessUnit,
                                        currentPeriod, currentYear);
                    } catch (Exception e) {
                        selectDBAdapter.close();
                        e.printStackTrace();
                    } finally {
                        selectDBAdapter.close();
                    }
                    System.out.println("chartDataMap === "+ chartDataMap);

                    if (chartDataMap.size() > 0) {
                        for (Map.Entry<String, Double> entry : chartDataMap.entrySet()) {
                            lstBrandNames.add(entry.getKey());
                            lstAchievedVals.add(entry.getValue());
                        }

                        ArrayList<Double> distribution = calc_Percentage(lstAchievedVals);
                        System.out.println("distribution === " + distribution);
                        lstBrandNames = set_lables(lstBrandNames, distribution);

                        CategorySeries distributionSeries = new CategorySeries(
                                "Brands - Achievement Progress");
                        for (int i = 0; i < distribution.size(); i++) {
                            distributionSeries.add(lstBrandNames.get(i), distribution.get(i));
                        }

                        DefaultRenderer defaultRenderer = new DefaultRenderer();
                        defaultRenderer.setApplyBackgroundColor(true);
                        defaultRenderer.setBackgroundColor(Color.WHITE);
                        defaultRenderer.setLabelsTextSize(25);
                        //defaultRenderer.setPanEnabled(true, false);

                        for (int i = 0; i < distribution.size(); i++) {

                            SimpleSeriesRenderer seriesRenderer = new SimpleSeriesRenderer();
                            Random rnd = new Random(); 
                            int color = Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));   
                            seriesRenderer.setColor(color);
                            seriesRenderer.setGradientEnabled(false);
                            seriesRenderer.setDisplayChartValues(true);
                            seriesRenderer.setShowLegendItem(false);



                            defaultRenderer.addSeriesRenderer(seriesRenderer);
                        }

                        defaultRenderer.setLabelsColor(Color.BLACK);
                        defaultRenderer.setChartTitle("Brands - Achievement Progress");
                        defaultRenderer.setChartTitleTextSize(30);
                        defaultRenderer.setZoomButtonsVisible(true);
                        defaultRenderer.setShowLabels(true);

                        if (mChartView == null) {
                            mChartView = ChartFactory.getPieChartView(getActivity(), distributionSeries, defaultRenderer);
                        } else {
                            mChartView.repaint();
                        }
                        //mChartView = ChartFactory.getPieChartView(getActivity(), distributionSeries, defaultRenderer);

                        //LayoutInflater layoutInflater = null;
                        //View popupView = layoutInflater.inflate(R.layout.popup, null);  
                        //View popupView = inflater.inflate(R.layout.pie_chart, null);

                        popupWindow = new PopupWindow(mChartView, LayoutParams.MATCH_PARENT,  
                                LayoutParams.MATCH_PARENT, false);
                        popupWindow.setOutsideTouchable(true);
                        popupWindow.showAsDropDown(mChartView, 50, 50);
                        popupWindow.setBackgroundDrawable(new BitmapDrawable());
                        popupWindow.setTouchInterceptor(new OnTouchListener() {

                            @Override
                            public boolean onTouch(View v, MotionEvent event) {
                                // TODO Auto-generated method stub
                                if (event.getAction() == MotionEvent.ACTION_OUTSIDE && event.getAction()==KeyEvent.KEYCODE_BACK) {
                                    popupWindow.dismiss();

                                }
                                return false;
                            }
                        });
                        //popupWindow.showAtLocation(mChartView, Gravity.CENTER, 10, 10);
                        //popupWindow.update();
                        /*FragmentTransaction ft = getFragmentManager().beginTransaction(); 

                        //mChartView.setId(1000);
                        ft.replace(, new DummySectionFragment(), "NewFragmentTag");
                        ft.addToBackStack(null);
                        ft.commit();*/
                        //chart_container = new LinearLayout(getActivity());
                        //chart_container.setId(1);
                        //LinearLayout chartContainer = (LinearLayout) rootView.findViewById(
                          //      R.id.chart_container);
                        //rootView = ChartFactory.getPieChartView(getActivity(), distributionSeries, defaultRenderer);
                        //chart_container.removeAllViews();
                        //chart_container.addView(mChartView);
                        /*ft.replace(rootView.getId(), new DummySectionFragment(), "NewFragmentTag");
                        //getActivity().setContentView(chart_container);
                        ft.addToBackStack(null);
                        ft.commit();*/



                        /*Intent intent = ChartFactory.getPieChartIntent(
                                getActivity(), distributionSeries,
                                defaultRenderer, "Dash Board");*/

                        //layout = new LinearLayout(getActivity());
                        //mChartView = ChartFactory.getPieChartView(getActivity(), distributionSeries, defaultRenderer);
                        /*Intent intent = ChartFactory.getPieChartIntent(
                                getActivity(), distributionSeries,
                                defaultRenderer, "Dash Board");*/
                        //getActivity().startActivity(intent);

                        /*layout.removeAllViews();  //This remove previous graph
                        layout.addView(mChartView); //This loads the graph again
                        layout.bringToFront();
                        getActivity().setContentView(layout);*/
                    }
                }
            });

        } else if (getArguments().getInt(ARG_SECTION_NUMBER) == 2) {
            rootView = inflater.inflate(R.layout.dashboard_vedio,
                    container, false);
            VideoView videoView = (VideoView) rootView
                    .findViewById(R.id.videoView1);
            MediaController mcontroller = new MediaController(
                    rootView.getContext());
            mcontroller.setAnchorView(mcontroller);
            String url = Environment.getExternalStorageDirectory()
                    + "/XONT/BabyCheramy.mp4";
            Uri video = Uri.parse(url);
            videoView.setVideoURI(video);
            videoView.setMediaController(mcontroller);
        } else {
            rootView = inflater.inflate(R.layout.fragment_main_dummy,
                    container, false);
        }
        return rootView;
    }
}

public static ArrayList<Double> calc_Percentage(ArrayList<Double> list) {

    ArrayList<Double> lstPercentage = new ArrayList<Double>();

    double total = 0;
    double precentage;
    for (int i = 0; i < list.size(); i++) {
        total = total + list.get(i);
    }
    System.out.println(total);
    for (int j = 0; j < list.size(); j++) {
        precentage = (list.get(j) / total) * 100;
        lstPercentage.add(precentage);
    }

    return lstPercentage;
}

public static ArrayList<String> set_lables(ArrayList<String> lstBrandNames, ArrayList<Double> distribution) {
    String G_lable;
    DecimalFormat df = new DecimalFormat("#.00");
    ArrayList<String> lstLabels = new ArrayList<String>();
    for (int i = 0; i < lstBrandNames.size(); i++) {
        G_lable = lstBrandNames.get(i) + " : " + df.format(distribution.get(i)) + "%";
        lstLabels.add(G_lable);
    }
    return lstLabels;

}

public class ImageAdapter extends BaseAdapter {
    private Context ctx;
    int imageBackground;

    public ImageAdapter(Context c) {
        ctx = c;
        TypedArray ta = obtainStyledAttributes(R.styleable.Gallery1);
        imageBackground = ta.getResourceId(
                R.styleable.Gallery1_android_galleryItemBackground, 1);
        ta.recycle();
    }

    @Override
    public int getCount() {

        return pics.length;
    }

    @Override
    public Object getItem(int arg0) {

        return arg0;
    }

    @Override
    public long getItemId(int arg0) {

        return arg0;
    }

    public View getView(int arg0, View arg1, ViewGroup arg2) {
        ImageView iv = new ImageView(ctx);
        iv.setImageResource(pics[arg0]);
        iv.setScaleType(ImageView.ScaleType.FIT_XY);
        iv.setLayoutParams(new Gallery.LayoutParams(150, 120));
        iv.setBackgroundResource(imageBackground);
        return iv;
    }
}

}

This is my new code.

private static boolean isChart = false;

popupWindow = new PopupWindow(mChartView, LayoutParams.MATCH_PARENT,  
                                LayoutParams.MATCH_PARENT, false);
                        popupWindow.setOutsideTouchable(true);
                        popupWindow.showAsDropDown(mChartView, 50, 50);
                        isChart = true;

@Override
public void onBackPressed() {
    System.out.println("BACKED");
    if(isChart) {
         popupWindow.dismiss();  
    } else {  
         super.onBackPressed();
    }
    //return;
}

It shows the chart. But it does not back from pie chart window when I press the back button in android. How can i solve this issue ? Any suggestions are highly appreciated.

Thanx in advance

You need to add this:

popupWindow.setBackgroundDrawable(new BitmapDrawable());

while creating your popup window, otherwise it will not react to any touch events because of background drawable being not set.

Your activity should override

@Override
   public void onBackPressed() {
}

Within that you should check whether the popup is visible , If so you should dismiss it

define bool _isVisible = false; // in class level bool _isVisible = false; // in class level Set _isVisible = true; // on popup.show _isVisible = true; // on popup.show

within onbackpressed()

    if(_isVisible)
        popup.dismiss();


@Override
public void onBackPressed() {
if(popupWindow != null) // dont check this if, put a bool value instead of this
{
     popupWindow.dismiss();  
} else {  
     super.onBackPressed();
}

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM