1

我有一个 android 应用程序,其国家地图分为多个地区......在 database.xml 文件中,我将每个地区的XY 坐标位置放在地图中......

但是,当我在具有不同屏幕尺寸的设备上运行应用程序时,位置会发生变化并且不适合我需要的位置!

所以,我想知道如何检测屏幕尺寸,并为每个屏幕分辨率创建一个单独的 XY 数据库!

先感谢您,


这是 MainActivity.java 代码,如果你还想要什么我会发布它,请我需要你的帮助!:(

private final Context appContext = MainActivity.this;
RelativeLayout relativeLayoutMap;
ProgressDialog xyProgressDialog;
Dialog dialog;
Spinner spinner;
MediaPlayer mediaPlayer;
static String extStorageDirectory = Environment
        .getExternalStorageDirectory().toString();
final static String TARGET_BASE_PATH = extStorageDirectory + "/";

@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    relativeLayoutMap = (RelativeLayout) findViewById(R.id.mapContainer);
    checklanguage();
    clickRadioButton();
    playMusicOnCoordinatesClick();
    new saveFoldertoSDCard().execute("MyApp");



    **//Display myDisplay = getWindowManager().getDefaultDisplay();
    //Point point = new Point();
    //myDisplay.getSize(point);
    //int width = point.x;
    //int height = point.y;**
}



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


public void clickRadioButton() {
    RadioButton rdbtnEnglish = (RadioButton) findViewById(R.id.rdBtnEnglish);
    if(rdbtnEnglish.isChecked()){
        saveLanguageSelection(true);
    }else{
        saveLanguageSelection(false);
    }
    rdbtnEnglish.setOnCheckedChangeListener(new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {
            // TODO Auto-generated method stub
            saveLanguageSelection(isChecked);
        }
    });
}


public void elabirate() {
    int coordinates = Coordinates.sCoordinatesList.size();
    int i;
    for (i = 0; i < coordinates; i++) {

        final Button btnclick = new Button(appContext);
        btnclick.setId(i);
        RadioButton rdbtnEnglish = (RadioButton) findViewById(R.id.rdBtnEnglish);
        if(rdbtnEnglish.isChecked()){
            btnclick.setText("" + Coordinates.sCoordinatesList.get(i).getName());
        }else{
            btnclick.setText("" + Coordinates.sCoordinatesList.get(i).getArabicCityName());
        }
        btnclick.setBackgroundResource(R.drawable.round_button_selector);

        btnclick.setTextColor(Color.CYAN);

        LayoutParams lp = new LayoutParams(
                android.app.ActionBar.LayoutParams.WRAP_CONTENT,
                android.app.ActionBar.LayoutParams.WRAP_CONTENT);
        lp.topMargin = Coordinates.sCoordinatesList.get(i).getX();
        lp.leftMargin = Coordinates.sCoordinatesList.get(i).getY();

        relativeLayoutMap.addView(btnclick, lp);


        btnclick.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Integer id = btnclick.getId();
                Intent intent = new Intent();
                intent.setClass(appContext, CityActivity.class);
                intent.putExtra("btnid", id.toString());
                startActivity(intent);
            }
        });
    }
}



public void changeCoordinatesLanguage(View view){
    RadioButton rdbtnEnglish = (RadioButton) findViewById(R.id.rdBtnEnglish);
    int coordinates = Coordinates.sCoordinatesList.size();
    int i;
    for (i = 0; i < coordinates; i++) {
        final Button btnCoordinates = (Button) findViewById(i);
        if(rdbtnEnglish.isChecked()){
            btnCoordinates.setText("" + Coordinates.sCoordinatesList.get(i).getName());
            loadCityList();
        }else{
            btnCoordinates.setText("" + Coordinates.sCoordinatesList.get(i).getArabicCityName());
            loadCityList();
        }
    }
}

public class GetCoordinates extends AsyncTask<String, Integer, Boolean> {
    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        xyProgressDialog = new ProgressDialog(appContext);
        xyProgressDialog.setMessage("Loading...");
        xyProgressDialog.setCancelable(false);
        xyProgressDialog.show();
        super.onPreExecute();
    }

    @Override
    protected Boolean doInBackground(String... params) {
        // TODO Auto-generated method stub

        return Coordinates.getCity();
    }

    @Override
    protected void onPostExecute(Boolean result) {
        // TODO Auto-generated method stub
        try {
            xyProgressDialog.dismiss();
            if (result) {
                elabirate();
                loadCityList();
            } else {
                Toast.makeText(appContext, "Unable to load City list",
                        Toast.LENGTH_SHORT).show();
            }
        } catch (Exception e) {
            // TODO: handle exception
        }
        super.onPostExecute(result);
    }
}


public void loadImage(){
      dialog = new Dialog(appContext);
      dialog.setContentView(R.layout.progress_dialog);
      dialog.setTitle("Load Progress");
      dialog.show();
}


public class saveFoldertoSDCard extends AsyncTask<String, Integer, Boolean> {

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        dialog = new Dialog(appContext);
          dialog.setContentView(R.layout.progress_dialog);
          dialog.setTitle("My App");
          dialog.setCancelable(false);
          dialog.show();

        super.onPreExecute();
    }

    @Override
    protected Boolean doInBackground(String... params) {
        // TODO Auto-generated method stub
        return copyFileOrDir(params[0]);
    }

    @Override
    protected void onPostExecute(Boolean result) {
        // TODO Auto-generated method stub
        try {
            //xyProgressDialog.dismiss();
            dialog.dismiss();
            if (result) {

                String path = Environment.getExternalStorageDirectory()
                        .toString()
                        + "/MyApp/MyAppdata.xml";
                new GetCoordinates().execute(path);
            }
        } catch (Exception e) {
            // TODO: handle exception
        }

        super.onPostExecute(result);
    }
}

private Boolean copyFileOrDir(String path) {
    AssetManager assetManager = this.getAssets();
    String assets[] = null;
    try {

        assets = assetManager.list(path);
        if (assets.length == 0) {
            copyFile(path);
        } else {
            String fullPath = TARGET_BASE_PATH + path;
            Log.i("tag", "path=" + fullPath);
            File dir = new File(fullPath);
            if (!dir.exists())
                if (!dir.mkdirs())
                    ;
            Log.i("tag", "could not create dir " + fullPath);
            for (int i = 0; i < assets.length; ++i) {
                String p;
                if (path.equals(""))
                    p = "";
                else
                    p = path + "/";

                copyFileOrDir(p + assets[i]);
            }
        }
        return true;
    } catch (IOException ex) {
        return false;
    }
}

private void copyFile(String filename) {
    AssetManager assetManager = this.getAssets();
    InputStream in = null;
    OutputStream out = null;
    String newFileName = null;
    try {
        in = assetManager.open(filename);
        if (filename.endsWith(".png")) // extension was added to avoid
                                        // compression on APK file
            newFileName = TARGET_BASE_PATH
                    + filename.substring(0, filename.length() - 4);
        else
            newFileName = TARGET_BASE_PATH + filename;
        out = new FileOutputStream(newFileName);

        byte[] buffer = new byte[1024];
        int read;
        while ((read = in.read(buffer)) != -1) {
            out.write(buffer, 0, read);
        }
        in.close();
        in = null;
        out.flush();
        out.close();
        out = null;
    } catch (Exception e) {
    }
}


public void saveLanguageSelection(boolean value) {
    SharedPreferences Shared_preferences = PreferenceManager
            .getDefaultSharedPreferences(appContext);
    SharedPreferences.Editor editor = Shared_preferences.edit();
    if (value) {
        editor.putString("lang", "english");
    } else {
        editor.putString("lang", "arabic");
    }
    editor.commit();
}

public void checklanguage() {
    RadioButton rdbtnEnglish = (RadioButton) findViewById(R.id.rdBtnEnglish);
    RadioButton rdbtnArabic = (RadioButton) findViewById(R.id.rdBtnArabic);
    SharedPreferences Shared_preferences = PreferenceManager
            .getDefaultSharedPreferences(appContext);
    String txtlanguage = Shared_preferences.getString("lang", "null");
    if (txtlanguage != "null") {
        if (txtlanguage.equals("english")) {
            rdbtnEnglish.setChecked(true);
            rdbtnArabic.setChecked(false);
        } else {
            rdbtnEnglish.setChecked(false);
            rdbtnArabic.setChecked(true);
        }
    } else {
        rdbtnEnglish.setChecked(true);
        rdbtnArabic.setChecked(false);
        saveLanguageSelection(true);
    }
}


public void showWeather(View view) {
    String url = "http://m.accuweather.com/";
    Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
    //parse: to check the availability of the url, ex: 123?
    startActivity(browserIntent);
}


public void aboutApp(View view) {
    openAboutDialog();
}


@SuppressWarnings("deprecation")
private void openAboutDialog() {
    final AlertDialog alertDialog = new AlertDialog.Builder(
            MainActivity.this).create();
    alertDialog.setTitle("About");
    alertDialog.setMessage("MyApp");
    alertDialog.setIcon(R.drawable.ic_launcher);
    alertDialog.setButton("OK", new DialogInterface.OnClickListener() {

        public void onClick(DialogInterface dialog, int which) {    
            alertDialog.dismiss();
        }
    });
    alertDialog.show();
}

public void loadCityList(){
    Integer type=0;
    RadioButton rdbtnEnglish = (RadioButton) findViewById(R.id.rdBtnEnglish);
    if(rdbtnEnglish.isChecked()){
        type=0;
    }else{
        type=1;
    }
    CityList.getAllCityList(type);
    CityListAdapter cityAdapter = new CityListAdapter(appContext, CityList.sCityList);
    spinner = (Spinner) findViewById(R.id.spinner1);
    spinner.setAdapter(cityAdapter);

    spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> arg0, View view,
                int arg2, long arg3) {
            // TODO Auto-generated method stub
            if(arg2 > 0){
                TextView txtcityId = (TextView) view.findViewById(R.id.txtCityId);
                TextView txtXyId = (TextView) view.findViewById(R.id.txtxyId);
                Intent intent = new Intent();
                intent.setClass(appContext, CityImagesActivity.class);
                intent.putExtra("xyid", txtXyId.getText().toString());
                intent.putExtra("cityid", txtcityId.getText().toString());
                startActivity(intent);

            }
        }
        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub
        }
    });
}


public void playMusicOnCoordinatesClick() {
    mediaPlayer = new MediaPlayer();
    mediaPlayer.reset();
    try {
        AssetFileDescriptor afd = getAssets().openFd("Intro.mp3");
        mediaPlayer.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());

    } catch (IllegalArgumentException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (SecurityException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (IllegalStateException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    try {
        mediaPlayer.prepare();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    if (mediaPlayer.isPlaying()) {
        mediaPlayer.stop();
    }
    mediaPlayer.setVolume(100, 100);
    mediaPlayer.start();
}


public void calledSearch(View view){
    Intent intent = new Intent();
    intent.setClass(appContext, SearchActivity.class);
    startActivity(intent);
}
4

1 回答 1

0

你可以使用类似的东西:

Display myDisplay = getWindowManager().getDefaultDisplay();
Point point = new Point();
myDisplay.getSize(point);
int width = point.x;
int height = point.y;

根据这个很棒的答案。

如果您的地图视图不是全屏,那么我建议使用百分比来设置地图的大小。这样,您可以使用坐标的百分比偏移来缓解屏幕尺寸变化的问题。您绝对不想为不同的屏幕分辨率存储不同的 XML 坐标集。

于 2013-06-06T22:24:03.230 回答