Android上的移动运营商输入字段

Android上的移动运营商输入字段,android,android-layout,Android,Android Layout,我想创建这样的手机输入。它包含国家/地区选择器、运营商代码和电话号码。我创建了国家选择器和电话号码 <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:gra

我想创建这样的手机输入。它包含国家/地区选择器、运营商代码和电话号码。我创建了国家选择器和电话号码

            <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:gravity="center"
            app:layout_marginTopPercent="65%"
            app:layout_widthPercent="70%">

            <com.hbb20.CountryCodePicker
                android:id="@+id/country_code"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                app:contentColor="@color/white"
                app:defaultNameCode="IL"
                app:hideNameCode="true"
                app:textSize="24sp" />

            <EditText
                android:id="@+id/et_number"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:digits="1234567890"
                android:inputType="number"
                android:maxLength="15"
                android:textColor="@color/white"
                android:textSize="24sp" />
        </LinearLayout>

如何为承运人代码创建编辑文本字段?它必须识别所选国家/地区的承运人编号。例如,如果用户选择Israel(+972),然后输入50,则必须将焦点切换到id=et_编号的EditText

我是这样做的

这是我的布局(放在PercentRelativeLayout内)

这里有一个从SIM卡读取和预填手机号码的功能

/**
 * Try to prefill SIM mobile number.
 * If permissions are not granted, request them.
 */
private void tryAndPrefillPhoneNumber() {
    if (checkCallingOrSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
        TelephonyManager manager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        et_carrier.setText(formatPhoneNumber(manager.getLine1Number(), defaultRegion, "carrier"));
        et_number.setText(formatPhoneNumber(manager.getLine1Number(), defaultRegion, "number"));

    } else {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, 0);
    }
}

/**
 * Try to prefill number, or show explanation to user
 * why permissions need to be granted
 *
 * @param requestCode
 * @param permissions
 * @param grantResults
 */
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        tryAndPrefillPhoneNumber();
    } else {
        if (ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[0])) {

            message = getString(R.string.permission_phone_number_text);

            showToast(message);
        }
    }
}

private String formatPhoneNumber(String phoneString, String countryIso, String type) {

    try {
        // information needed to search for phone phone using google lib
        PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
        Phonenumber.PhoneNumber phoneNumber = phoneUtil.parse(phoneString, countryIso);
        int carrierLength = phoneUtil.getLengthOfNationalDestinationCode(phoneNumber);

        if (type != null) {
            if (type.equals("local")) {
                // parse the phone number without country code
                return String.valueOf(phoneNumber.getNationalNumber());

            } else if (type.equals("carrier")) {
                // parse mobile carrier number
                return String.valueOf(phoneNumber.getNationalNumber()).substring(0, carrierLength);

            } else if (type.equals("number")) {
                // parse phone number without country code and carrier number
                return String.valueOf(phoneNumber.getNationalNumber()).substring(carrierLength);

            } else {
                //parse full number
                return phoneUtil.format(phoneNumber, PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL);
            }
        }

    } catch (NumberParseException e) {
        e.printStackTrace();
    }

    // if not phone number found return
    return null;
}
country_code = (CountryCodePicker) findViewById(R.id.country_code);
et_carrier = (EditText) findViewById(R.id.et_carrier);
et_number = (EditText) findViewById(R.id.et_number);

// Get country code from sim
defaultRegion = PhoneNumberUtils.getDefaultCountryIso(getApplicationContext());

// Set country code to spinner
country_code.setCountryForNameCode(defaultRegion);

// set white underline in number edit text
et_number.getBackground().mutate().setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);
et_carrier.getBackground().mutate().setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);

// jump to number edit when carrier code is filled
et_carrier.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void afterTextChanged(Editable editable) {
    if (editable.length() == 3) {
        et_number.requestFocus();
        et_number.setSelection(et_number.getText().length());
    }

    }
});

// jump to carrier edit when number is deleted
et_number.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

}

@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    if (TextUtils.isEmpty(et_number.getText())) {
        et_carrier.requestFocus();
        et_carrier.setSelection(et_carrier.getText().length());
}

}

@Override
public void afterTextChanged(Editable editable) {
}
});
/**
 * Try to prefill SIM mobile number.
 * If permissions are not granted, request them.
 */
private void tryAndPrefillPhoneNumber() {
    if (checkCallingOrSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
        TelephonyManager manager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        et_carrier.setText(formatPhoneNumber(manager.getLine1Number(), defaultRegion, "carrier"));
        et_number.setText(formatPhoneNumber(manager.getLine1Number(), defaultRegion, "number"));

    } else {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, 0);
    }
}

/**
 * Try to prefill number, or show explanation to user
 * why permissions need to be granted
 *
 * @param requestCode
 * @param permissions
 * @param grantResults
 */
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        tryAndPrefillPhoneNumber();
    } else {
        if (ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[0])) {

            message = getString(R.string.permission_phone_number_text);

            showToast(message);
        }
    }
}

private String formatPhoneNumber(String phoneString, String countryIso, String type) {

    try {
        // information needed to search for phone phone using google lib
        PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
        Phonenumber.PhoneNumber phoneNumber = phoneUtil.parse(phoneString, countryIso);
        int carrierLength = phoneUtil.getLengthOfNationalDestinationCode(phoneNumber);

        if (type != null) {
            if (type.equals("local")) {
                // parse the phone number without country code
                return String.valueOf(phoneNumber.getNationalNumber());

            } else if (type.equals("carrier")) {
                // parse mobile carrier number
                return String.valueOf(phoneNumber.getNationalNumber()).substring(0, carrierLength);

            } else if (type.equals("number")) {
                // parse phone number without country code and carrier number
                return String.valueOf(phoneNumber.getNationalNumber()).substring(carrierLength);

            } else {
                //parse full number
                return phoneUtil.format(phoneNumber, PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL);
            }
        }

    } catch (NumberParseException e) {
        e.printStackTrace();
    }

    // if not phone number found return
    return null;
}