Внешние шрифты SVG не загружаются, когда в & lt; img & gt; тег, но тонкий встроенный или один [дубликат]

Вы не можете вернуть то, что еще не загружено. Firestore загружает данные asynchronously, так как для этого может потребоваться некоторое время. В зависимости от скорости соединения и состояния, может потребоваться от нескольких сотен миллисекунд до нескольких секунд, прежде чем эти данные будут доступны. Если вы хотите передать объект settings другому методу, просто вызовите этот метод внутри метода onSuccess() и передайте этот объект в качестве аргумента. Таким образом, быстрое исправление будет следующим:

@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
    UserAccountSettings settings = documentSnapshot.toObject(UserAccountSettings.class);
    yourMethod(settings);
}

Еще одно замечание: вам не нужно устанавливать эти значения для объекта, который уже имеет их. Вы уже получаете данные из базы данных в качестве объекта.

blockquote>

Так что помните, что метод onSuccess() имеет асинхронное поведение, а это означает, что вызывается еще до того, как вы получите данные из своего база данных. Если вы хотите использовать объект settings вне этого метода, вам нужно создать свой собственный callback. Для этого сначала нужно создать такой интерфейс:

public interface MyCallback {
    void onCallback(UserAccountSettings settings);
}

Затем вам нужно создать метод, который фактически получает данные из базы данных. Этот метод должен выглядеть так:

public void readData(MyCallback myCallback) {
    DocumentReference mSettings = mFirebaseFirestore.collection("user_account_settings").document(userID);
    mSettings.get().addOnSuccessListener(new OnSuccessListener() {
        @Override
        public void onSuccess(DocumentSnapshot documentSnapshot) {
            UserAccountSettings settings = documentSnapshot.toObject(UserAccountSettings.class);
            myCallback.onCallback(settings);

        }
    });
}

. В конце просто просто вызовите метод readData() и передайте экземпляр интерфейса MyCallback в качестве аргумента везде, где вам это нужно:

readData(new MyCallback() {
    @Override
    public void onCallback(UserAccountSettings settings) {
        Log.d("TAG", settings.getDisplay_name());
    }
});

Это единственный способ, которым вы можете использовать этот объект класса UserAccountSettings вне метода onSuccess(). Для получения дополнительной информации вы также можете посмотреть видео .

11
задан Mikulas Dite 3 January 2014 в 15:42
поделиться

2 ответа

В итоге я использовал это:

<defs>
<style type="text/css">
<![CDATA[
    @font-face {
        font-family: "Open Sans";
        src: local("Open Sans"), /* IE */
            local("OpenSans"),
            url("data:application/vnd.ms-fontobject;charset=utf-8;base64,{$fontEot}") format('embedded-opentype'),
            url("data:application/x-font-woff;charset=utf-8;base64,{$fontWoff}") format('woff'),
            url('https://example.com/OpenSans-Regular.ttf') format('truetype');
    }
]]>
</style>

Поддержка:

+------------+--------+-------+-------+-----------+
|            | Win XP | Win 7 | iOS 6 | OS X 10.9 |
+------------+--------+-------+-------+-----------+
| IE  8      |     no |    no |       |           |
| IE  9      |        |   yes |       |           |
| IE 10      |        |   yes |       |           |
| IE 11      |        |   yes |       |           |
| Safari 4   |        |   yes |       |           |
| Safari 5.0 |        |   yes |       |           |
| Safari 5.1 |        |    no |       |           |
| Safari 7   |        |    no |       |       yes |
| Safari iOS |        |       |   yes |           |
| FF  3.6    |     no |    no |       |           |
| FF  4      |    yes |   yes |       |           |
| FF 27      |    yes |   yes |       |       yes |
| Chrome 14  |    yes |   yes |       |           |
| Chrome 33  |    yes |   yes |       |       yes |
| Opera 10.6 |    yes |   yes |       |           |
| Opera 19   |    yes |       |       |           |
+------------+--------+-------+-------+-----------+

Per http://gs.statcounter.com/#browser_version_partially_combined-ww- ежемесячно-201310-201312-бар это составляет общую поддержку где-то около 85%.

Единственное, что действительно беспокоит, - это то, что Safari 5.1 вообще не отображает текст. Я должен был сделать Safari только резерв в объявлении css:

/* Win Safari fallback */
@media screen and (-webkit-min-device-pixel-ratio:0) { 
    /* Safari only */
    ::i-block-chrome,text {
        font-family: 'Verdana';
    }
}

В любом случае, вложение шрифта просто кажется неправильным, поскольку файлы огромны.

4
ответ дан Mikulas Dite 27 August 2018 в 14:09
поделиться

В Firefox, по крайней мере, изображения должны быть полностью автономными, т.е. все в одном файле для соображений неприкосновенности .

Если вы хотите, чтобы шрифты работали, вам придется base64 закодирует их и вставляет их как URL-адреса данных в файл SVG, т. е.

@font-face {
    font-family: 'Open Sans';
    src: url("data:application/x-font-ttf;base64,[base-encoded font here]");
}
8
ответ дан Robert Longson 27 August 2018 в 14:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: