为选择国家代码创建一个旋转器

9

我希望创建一个下拉菜单,用于选择国家并获取其国家代码。

我已经找到了这个项目列表:

<string-array name="countryCodes">
    <item>93,AF</item>
    <item>355,AL</item>
    <item>213,DZ</item>
    <item>376,AD</item>
    <item>244,AO</item>
    <item>672,AQ</item>
    <item>54,AR</item>
    <item>374,AM</item>
    <item>297,AW</item>
    <item>61,AU</item>
    <item>43,AT</item>
    <item>994,AZ</item>
    <item>973,BH</item>
    <item>880,BD</item>
    <item>375,BY</item>
    <item>32,BE</item>
    <item>501,BZ</item>
    <item>229,BJ</item>
    <item>975,BT</item>
    <item>591,BO</item>
    <item>387,BA</item>
    <item>267,BW</item>
    <item>55,BR</item>
    <item>673,BN</item>
    <item>359,BG</item>
    <item>226,BF</item>
    <item>95,MM</item>
    <item>257,BI</item>
    <item>855,KH</item>
    <item>237,CM</item>
    <item>1,CA</item>
    <item>238,CV</item>
    <item>236,CF</item>
    <item>235,TD</item>
    <item>56,CL</item>
    <item>86,CN</item>
    <item>61,CX</item>
    <item>61,CC</item>
    <item>57,CO</item>
    <item>269,KM</item>
    <item>242,CG</item>
    <item>243,CD</item>
    <item>682,CK</item>
    <item>506,CR</item>
    <item>385,HR</item>
    <item>53,CU</item>
    <item>357,CY</item>
    <item>420,CZ</item>
    <item>45,DK</item>
    <item>253,DJ</item>
    <item>670,TL</item>
    <item>593,EC</item>
    <item>20,EG</item>
    <item>503,SV</item>
    <item>240,GQ</item>
    <item>291,ER</item>
    <item>372,EE</item>
    <item>251,ET</item>
    <item>500,FK</item>
    <item>298,FO</item>
    <item>679,FJ</item>
    <item>358,FI</item>
    <item>33,FR</item>
    <item>689,PF</item>
    <item>241,GA</item>
    <item>220,GM</item>
    <item>995,GE</item>
    <item>49,DE</item>
    <item>233,GH</item>
    <item>350,GI</item>
    <item>30,GR</item>
    <item>299,GL</item>
    <item>502,GT</item>
    <item>224,GN</item>
    <item>245,GW</item>
    <item>592,GY</item>
    <item>509,HT</item>
    <item>504,HN</item>
    <item>852,HK</item>
    <item>36,HU</item>
    <item>91,IN</item>
    <item>62,ID</item>
    <item>98,IR</item>
    <item>964,IQ</item>
    <item>353,IE</item>
    <item>44,IM</item>
    <item>972,IL</item>
    <item>39,IT</item>
    <item>225,CI</item>
    <item>81,JP</item>
    <item>962,JO</item>
    <item>7,KZ</item>
    <item>254,KE</item>
    <item>686,KI</item>
    <item>965,KW</item>
    <item>996,KG</item>
    <item>856,LA</item>
    <item>371,LV</item>
    <item>961,LB</item>
    <item>266,LS</item>
    <item>231,LR</item>
    <item>218,LY</item>
    <item>423,LI</item>
    <item>370,LT</item>
    <item>352,LU</item>
    <item>853,MO</item>
    <item>389,MK</item>
    <item>261,MG</item>
    <item>265,MW</item>
    <item>60,MY</item>
    <item>960,MV</item>
    <item>223,ML</item>
    <item>356,MT</item>
    <item>692,MH</item>
    <item>222,MR</item>
    <item>230,MU</item>
    <item>262,YT</item>
    <item>52,MX</item>
    <item>691,FM</item>
    <item>373,MD</item>
    <item>377,MC</item>
    <item>976,MN</item>
    <item>382,ME</item>
    <item>212,MA</item>
    <item>258,MZ</item>
    <item>264,NA</item>
    <item>674,NR</item>
    <item>977,NP</item>
    <item>31,NL</item>
    <item>599,AN</item>
    <item>687,NC</item>
    <item>64,NZ</item>
    <item>505,NI</item>
    <item>227,NE</item>
    <item>234,NG</item>
    <item>683,NU</item>
    <item>850,KP</item>
    <item>47,NO</item>
    <item>968,OM</item>
    <item>92,PK</item>
    <item>680,PW</item>
    <item>507,PA</item>
    <item>675,PG</item>
    <item>595,PY</item>
    <item>51,PE</item>
    <item>63,PH</item>
    <item>870,PN</item>
    <item>48,PL</item>
    <item>351,PT</item>
    <item>1,PR</item>
    <item>974,QA</item>
    <item>40,RO</item>
    <item>7,RU</item>
    <item>250,RW</item>
    <item>590,BL</item>
    <item>685,WS</item>
    <item>378,SM</item>
    <item>239,ST</item>
    <item>966,SA</item>
    <item>221,SN</item>
    <item>381,RS</item>
    <item>248,SC</item>
    <item>232,SL</item>
    <item>65,SG</item>
    <item>421,SK</item>
    <item>386,SI</item>
    <item>677,SB</item>
    <item>252,SO</item>
    <item>27,ZA</item>
    <item>82,KR</item>
    <item>34,ES</item>
    <item>94,LK</item>
    <item>290,SH</item>
    <item>508,PM</item>
    <item>249,SD</item>
    <item>597,SR</item>
    <item>268,SZ</item>
    <item>46,SE</item>
    <item>41,CH</item>
    <item>963,SY</item>
    <item>886,TW</item>
    <item>992,TJ</item>
    <item>255,TZ</item>
    <item>66,TH</item>
    <item>228,TG</item>
    <item>690,TK</item>
    <item>676,TO</item>
    <item>216,TN</item>
    <item>90,TR</item>
    <item>993,TM</item>
    <item>688,TV</item>
    <item>971,AE</item>
    <item>256,UG</item>
    <item>44,GB</item>
    <item>380,UA</item>
    <item>598,UY</item>
    <item>1,US</item>
    <item>998,UZ</item>
    <item>678,VU</item>
    <item>39,VA</item>
    <item>58,VE</item>
    <item>84,VN</item>
    <item>681,WF</item>
    <item>967,YE</item>
    <item>260,ZM</item>
    <item>263,ZW</item>
</string-array>

但它并没有包含完整的名称,只有简称。如果有一份包含完整英文名称的清单就太好了。

另外,我想给这个列表换一种显示格式,但是我该怎么做呢?目前我是使用安卓文档中的这种方法:

    Spinner spinner = (Spinner) findViewById(R.id.spinner);
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,R.array.planets_array, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter);

但我不知道如何在那里编辑项目列表的内容。

你能帮我吗?


你说“我想给列表另一种格式来显示”,是什么意思?你想要哪种其他的格式? - Rohan Kandwal
我现在的做法是,我的旋转器显示与项目中编写的数据完全相同,例如“49,DE”。但我想让它变成“德国(+49)”或类似的形式。 - Froxx
http://www.mapsofworld.com/world-maps/country-dialing-code.html 上有一个国家代码列表。从那里获取数据并将其插入到您的字符串数组中。 - Rohan Kandwal
3个回答

22

我为你提供了更简单的解决方案。你可以直接使用Country Code Picker (CCP)库。这将节省你编写样板代码的时间。你只需要在布局XML中放置CountryCodePicker视图。这是CCP视图

你的视图将会和你手机上的编辑框一样。

从PlayStore下载示例应用程序

点击CCP将会打开一个包含可供选择的国家列表的对话框。在这里,你可以通过国家名称、代码名称和电话代码来搜索国家。它还提供了自动格式化电话号码的选项。

选择的国家详细信息可以轻松地阅读。了解更多详细信息,请访问该库的Github页面


如何使Spinner与位于TextInputLayout内的EditText同级,并且都带有下划线? - blueware
@blueware,请问您能否详细说明问题? - HBB20
@HBB20,请查看我的问题:TextInputLayout与Spinner对齐的问题 - blueware
1
@blueware,我在那里发布了答案。如果它对你有用,请告诉我。(仅在该主题线上) - HBB20
哦.. 什么依赖关系?如果您能创建一个带有详细信息的 GitHub 问题,那将非常有帮助。这是 GitHub 存储库 - HBB20
显示剩余2条评论

9

在Gradle中:

    // country picker
    implementation 'com.hbb20:ccp:1.7.1'

在XML中

<com.hbb20.CountryCodePicker
                        android:id="@+id/ccp"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:background="@color/colorGreyF5"
                        android:onClick="onCountryPickerClick"
                        android:paddingStart="@dimen/margin_10" />

在Activity中:

CountryCodePicker ccp;
ccp = findViewById(R.id.ccp);
    public void onCountryPickerClick(View view) {
        ccp.setOnCountryChangeListener(new CountryCodePicker.OnCountryChangeListener() {
            @Override
            public void onCountrySelected() {
                //Alert.showMessage(RegistrationActivity.this, ccp.getSelectedCountryCodeWithPlus());
                selected_country_code = ccp.getSelectedCountryCodeWithPlus();
            }
        });
    }

当活动创建时,我无法获得默认选择的国家代码,只有当我点击国家选择微调器时才会获得,即使默认国家已经被选择。有什么解决办法吗? - xaif
1
@xaif 你应该添加这个属性 app:ccp_autoDetectCountry="true" - Sara Talaat
@SaraTalaat 谢谢您的评论。顺便说一下,我已经完成了 :) 更多信息请访问:https://github.com/hbb20/CountryCodePickerProject - xaif

0

这些是ISO 3166-1 alpha-2 codes。你可以在ISO的网站上找到完整的列表。

在JavaScript控制台中运行以下代码(在Chrome中测试)可以得到一个从代码到国家的JSON格式的映射:

var result = {}
var rows = document.getElementsByTagName('tr');
for (var i=1; i<rows.length; i++) {
  var code = rows[i].cells[0].textContent;
  var country = rows[i].cells[1].textContent;
  result[code] = country;
}
console.log(JSON.stringify(result));

我知道这些代码,但实际上我不想手动为大约200个国家编写翻译器。你知道我可以从那里提取数据的方法吗? - Froxx
您可以在CSV文件中获取这些代码,并从CSV文件中读取它们。 - Straw Hat
好的,我已经成功在我的string.xml中创建了一个字符串数组 - 谢谢。但是还有第二个问题:如何更改显示格式?我已经让数组适配器从我的类中的字符串数组获取数据,而不是从xml文件中获取,但是如何将数据导入其中呢? - Froxx
好的,过了一会儿我自己弄明白了。String[] array = getResources().getStringArray(R.array.countryCodes);。这样就可以了。现在我在我的类中有一个可以编辑的数组。 - Froxx
这个答案值得点赞。作为一名程序员,我们不仅要使用现成的工具,还需要拥有其他技能。对于Android开发者来说,运行脚本非常容易。谢谢。 - Gaket

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接