Android Некоторые устройства просмотра текста устройства не работают, а некоторые работают - PullRequest
1 голос
/ 23 апреля 2020

Я работаю над редактированием текста в приведенном ниже коде. Я извлекаю текст после ввода @, но этот код работает на каком-то устройстве, а не на каком-то устройстве.

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

Это рабочее видео

Это не рабочее видео

Любой, кто поможет мне решить эту проблему. Этот код работает на некоторых устройствах, но на некоторых устройствах.

publi c class SocialMentionAutoComplete extends AppCompatMultiAutoCompleteTextView {

UserSearchChatAdapter userSearchChatAdapter;
ArrayMap<String, UserModel> map = new ArrayMap<>();

String formattedOfString = "@%s ";
Context context;

public SocialMentionAutoComplete(Context context) {
    super(context);
    initializeComponents(context);
}

public SocialMentionAutoComplete(Context context, AttributeSet attrs) {
    super(context, attrs);
    initializeComponents(context);
}

public SocialMentionAutoComplete(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    initializeComponents(context);
}

private void initializeComponents(Context context) {
    this.context = context;

    addTextChangedListener(textWatcher);
    setOnItemClickListener(onItemSelectedListener);
    setTokenizer(new SpaceTokenizer());


}

AdapterView.OnItemClickListener onItemSelectedListener = new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

        UserModel mentionPerson = (UserModel) adapterView.getItemAtPosition(i);
        map.put("@" + mentionPerson.username, mentionPerson);
    }
};


/***
 *This function returns the contents of the AppCompatMultiAutoCompleteTextView into my desired Format
 *You can write your own function according to your needs
 **/

public String getProcessedString() {

    String s = getText().toString();

    for (Map.Entry<String, UserModel> stringMentionPersonEntry : map.entrySet()) {
        s = s.replace(stringMentionPersonEntry.getKey(), stringMentionPersonEntry.getValue().getFormattedValue());
    }
    return s;
}

/**
 * This function will process the incoming text into mention format
 * You have to implement the processing logic
 */
public void setMentioningText(String text) {

    map.clear();

    Pattern p = Pattern.compile("\\[([^]]+)]\\(([^ )]+)\\)");
    Matcher m = p.matcher(text);

    String finalDesc = text;

    while (m.find()) {
        UserModel mentionPerson = new UserModel();
        String name = m.group(1);
        String username = m.group(2);
        //Processing Logic
        finalDesc = finalDesc.replace("@[" + name + "](" + username + ")", "@" + username);

        mentionPerson.name = name;
        mentionPerson.username = username;
        map.put("@" + username, mentionPerson);
    }
    int textColor = ResourcesCompat.getColor(getResources(), R.color.colorPrimary, null);
    Spannable spannable = new SpannableString(finalDesc);
    for (Map.Entry<String, UserModel> stringMentionPersonEntry : map.entrySet()) {
        int startIndex = finalDesc.indexOf(stringMentionPersonEntry.getKey());
        int endIndex = startIndex + stringMentionPersonEntry.getKey().length();
        spannable.setSpan(new ForegroundColorSpan(textColor), startIndex, endIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    }
    setText(spannable);
}


TextWatcher textWatcher = new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int lengthBefore, int lengthAfter) {


        try {
            if (!s.toString().isEmpty() && s.length() > 1) {//start < s.length()
                String name;

                if (lengthAfter > lengthBefore) {

                    name = s.toString().substring(0, start + 1);
                } else {
                    name = s.toString().substring(0, start);
                }

                if (name.contains("\n")) {
                    name = name.replaceAll("\n", "");
                }
                s = name;// this is main passing

                int lastTokenIndex = name.lastIndexOf(" @");
                int lastIndexOfSpace = name.lastIndexOf(" ");
                int nextIndexOfSpace = name.indexOf(" ", start);

                if (lastIndexOfSpace > 0 && lastTokenIndex < lastIndexOfSpace) {
                    String afterString = s.toString().substring(lastIndexOfSpace, s.length());

                    if (afterString.startsWith(" ") && !afterString.startsWith(" \n")) return;
                }

                if (lastTokenIndex < 0) {
                    if (!name.isEmpty() && name.length() >= 1 && name.startsWith("@")) {
                        lastTokenIndex = 1;
                    } else
                        return;
                }

                int tokenEnd = lastIndexOfSpace;

                if (lastIndexOfSpace <= lastTokenIndex) {
                    tokenEnd = name.length();
                    if (nextIndexOfSpace != -1 && nextIndexOfSpace < tokenEnd) {
                        tokenEnd = nextIndexOfSpace;
                    }
                }

                if (lastTokenIndex >= 0) {
                    name = s.toString().substring(lastTokenIndex, tokenEnd).trim();
                    Pattern pattern = Pattern.compile("^(.+)\\s.+");
                    Matcher matcher = pattern.matcher(name);
                    if (!matcher.find()) {
                        // name = name.replace("@", "").trim();

                        if (name.equals("@")) {
                            //  getPollsDetail("@");
                        } else if (!name.isEmpty()) {
                            getUsers(name);
                        }
                    }
                }
            } else if (!s.toString().isEmpty() && s.length() == 1 && s.toString().equals("@")) {
                {
                    // getPollsDetail("@");
                }

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


    }

    @Override
    public void afterTextChanged(Editable editable) {

    }
};


/*
 *This function returns results from the web server according to the user name
 * I have used Retrofit for Api Communications
 * */
public void getUsers(String name) {


    AndroidNetworking.cancel("SearchUser");

    String url = WebServiceUrl.SEARCH_USER + name.replace("@", "");
    new WebTask().nameSearchAPI(context, url, new WebCompleteTaskNew() {
        @Override
        public void onComplete(String response, int taskcode, String callUrl) {
            try {
                JSONObject baseResponse = new JSONObject(response);
                JSONObject jsonValue = baseResponse.getJSONObject("value");
                if (taskcode == RequestCode.CODE_SEARCH_PEOPLE) {

                    List<UserModel> peopleArrayList = new Gson().fromJson(jsonValue.getJSONArray("data").toString(), new TypeToken<List<UserModel>>() {
                    }.getType());

                    userSearchChatAdapter = new UserSearchChatAdapter(getContext(), peopleArrayList, name);
                    SocialMentionAutoComplete.this.setAdapter(userSearchChatAdapter);

                    System.out.println("URLL::" + url + "::CLLLLL::" + callUrl);

                    if (callUrl.equals(url)) {
                        showDropDown();
                    }
                    // SocialMentionAutoComplete.this.showDropDown();
                }

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

        }

        @Override
        public void onError(String message, int taskcode) {

        }
    });



}


public class SpaceTokenizer implements MultiAutoCompleteTextView.Tokenizer {

    public int findTokenStart(CharSequence text, int cursor) {

        int i = cursor;

        while (i > 0 && text.charAt(i - 1) != ' ') {
            i--;
        }
        while (i < cursor && text.charAt(i) == ' ') {
            i++;
        }
        return i;
    }

    public int findTokenEnd(CharSequence text, int cursor) {

        int i = cursor;
        int len = text.length();

        while (i < len) {
            if (text.charAt(i) == ' ') {
                return i;
            } else {
                i++;
            }
        }

        return len;
    }

    public CharSequence terminateToken(CharSequence text) {

        int i = text.length();

        while (i > 0 && text.charAt(i - 1) == ' ') {
            i--;
        }

        if (i > 0 && text.charAt(i - 1) == ' ') {
            return text;
        } else {
            // Returns colored text for selected token
            SpannableString sp = new SpannableString(String.format(formattedOfString, text));
            int textColor = ResourcesCompat.getColor(getResources(), R.color.colorPrimary, null);
            sp.setSpan(new ForegroundColorSpan(textColor), 0, text.length() + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            return sp;
        }
    }
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...