1

私は興味深い(少なくとも私にとっては)問題を抱えています:

必要に応じてアプリにポップアップする通知があります。すべてが私のGalaxySIIでうまく機能し(スプリントからのエピックタッチ4g、S IIのモデルは非常に異なるため、具体的にする必要があると思います)、通知ワードは問題なく折り返されます-たとえば、次のようになります。

this is a notification, but it's too long, 
so it'll show this second line on it's own.

恐ろしいことに、一部のAndroidスマートフォンは自動ワードラップを行わず、実際には画面の最後で通知をカットしただけなので、上記のメッセージは次のように表示されます。

this is a notification, but it's too long, 

明らかに、これはしません。では、メッセージ全体が常に表示されるようにするにはどうすればよいですか?

4

1 に答える 1

0

リライト

前に説明したように、通知を強制的tickerTextにワードラップする必要があります。1つのアプローチは、テキストを適切な長さの行に分割し、それぞれに通知を送信することです。

public class Example extends Activity {
    public class AlarmReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.v("Example", "Alarm received");
            sendNotification();
        }
    }

    AlarmManager alarmManager;
    NotificationManager notificationManager;

    AlarmReceiver alarmReceiver = new AlarmReceiver();
    Notification notification = new Notification(); 
    Intent notificationIntent;
    PendingIntent pendingIntent;
    int tickerIndex = 0;
    List<String> tickerTexts = new ArrayList<String>();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

        // Determine the screen width and density, split tickerText appropriately
        String tickerText = "A tickerText that is long enough to cause a word wrap in portrait.";
        tickerTexts.add(tickerText.substring(0, 35));
        tickerTexts.add(tickerText.substring(35));

        notificationIntent = new Intent(this, Example.class);
        pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

        notification.flags = Notification.FLAG_ONLY_ALERT_ONCE;
        notification.icon = android.R.drawable.star_on;

        sendNotification();
        registerReceiver(alarmReceiver, new IntentFilter("Generic"));
    }

    @Override
    protected void onDestroy() {
        unregisterReceiver(alarmReceiver);
        super.onDestroy();
    }

    public void sendNotification() {
        Log.v("Example", "Send Notification " + tickerIndex);

        notification.tickerText = tickerTexts.get(tickerIndex);
        notification.setLatestEventInfo(this, "Title", "Text " + tickerIndex, pendingIntent);
        notificationManager.cancel(0);
        notificationManager.notify(0, notification);

        tickerIndex++;
        if(tickerIndex < tickerTexts.size()) {
            Log.v("Example", "Setting up alarm");
            PendingIntent alarmPending = PendingIntent.getBroadcast(this, 0, new Intent("Generic"), 0);
            alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 1000, alarmPending);
        }
    }
}

ただし、セットアップの不可欠な部分をスキップしたことがわかります。テキストの長さが収まると想定し、計算しませんでした。適切なブレークポイントを決定するには、画面の幅、フォントの拡大縮小サイズ、および密度を計算する必要があります。また、「!!!」という事実を考慮する必要があります。フォントによっては「www」よりも短い場合があり、ユーザーは横向きと縦向きを切り替えることができます...ソースコードを調べて、一般的なAndroidがtickerTextをどのように分割するかを確認できます。

とにかく、tickerTextをワードラップに強制することは、元の文字列を凝縮したり、「折り返しのない」電話メーカーに怒った文字を送信したりするよりも複雑な場合があります。

于 2012-07-22T18:31:16.723 に答える