Android: проблема со всплывающим окном

Я использовал следующий код для создания круговой диаграммы во всплывающем окне в фрагменте.

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;
 }
 });

Это мой полный код.

public class MainActivity extends SherlockFragmentActivity {
private SectionsPagerAdapter mSectionsPagerAdapter;
private ViewPager mViewPager;
private Boolean is3g, isWifi;
private int networkType;
private TelephonyManager *************;
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) {
 **********************().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();

 ************* = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
 networkType = *************.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,
 *************, tvOutlet, tvTargetVal;
 private Button btnpieChart;
 private ProgressBar progressBar;
 private ArrayList<wmtargetexecachievesummary> lstExeSummaryData;
 private DecimalFormat deciFormatter = new DecimalFormat("#.00");
 private ****** 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, ******=""> chartDataMap = new HashMap<string, ******="">();
 private ArrayList<string> lstBrandNames = new ArrayList<string>();
 private ArrayList<******> lstAchievedVals = new ArrayList<******>();
 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);
 ************* = (TextView) rootView.findViewById(R.id.*************);
 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, ******=""> entry : chartDataMap.entrySet()) {
 lstBrandNames.add(entry.getKey());
 lstAchievedVals.add(entry.getValue());
 }

 ArrayList<******> 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<******> calc_Percentage(ArrayList<******> list) {

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

 ****** total = 0;
 ****** 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<******> 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;
 ********** 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;
 }
}
</string></string></******></string></string></******></******></******></******></******></string,></******></******></string></string></string,></string,></string,></string,></wmtargetexecachievesummary></xaperiodenddate></xaperiodenddate>

}

Это мой новый код.

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;
}

Он показывает график. Но он не возвращается из окна круговой диаграммы, когда я нажимаю кнопку "Назад" в android. Как я могу решить эту проблему? Любые предложения приветствуются.

Заранее спасибо

2 ответа

Вы должны добавить это:

popupWindow.setBackgroundDrawable(new BitmapDrawable());

при создании всплывающего окна, в противном случае он не будет реагировать на какие-либо события касания из-за невозможности установки фона.


Ваша деятельность должна переопределить

@Override
 public void onBackPressed() {
}

В этом случае вы должны проверить, отображается ли всплывающее окно, если это так, вы должны его отклонить

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

внутри 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();
}

}

licensed under cc by-sa 3.0 with attribution.