Opção 1: Forma Drawable
Essa é a opção mais simples se você quiser uma borda em torno de um layout ou exibição na qual possa definir o plano de fundo. Crie um arquivo XML na drawablepasta que se parece com isso:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<solid android:color="#8fff93" />
<stroke
android:width="1px"
android:color="#000" />
</shape>
Você pode remover o solidse não desejar um preenchimento. O conjunto background="@drawable/your_shape_drawable"no seu layout / exibição.
Opção 2: Vista em segundo plano
Aqui está um pequeno truque que eu usei no RelativeLayout. Basicamente, você tem um quadrado preto embaixo da vista que deseja dar uma borda e, em seguida, dê a ela um pouco de preenchimento (não margem!) Para que o quadrado preto apareça nas bordas.
Obviamente, isso só funciona corretamente se a visualização não tiver áreas transparentes. Se isso acontecer, recomendo que você escreva um costume BorderViewque desenhe apenas a borda - deve haver apenas algumas dezenas de linhas de código.
<View
android:id="@+id/border"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/image"
android:layout_alignLeft="@+id/image"
android:layout_alignRight="@+id/image"
android:layout_alignTop="@+id/main_image"
android:background="#000" />
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_...
android:padding="1px"
android:src="@drawable/..." />
Se você está se perguntando, ele faz o trabalho com adjustViewBounds=true. No entanto, não funciona se você deseja ter um plano de fundo em um todo RelativeLayout, porque há um erro que impede que você preencha um RelativeLayoutcom a View. Nesse caso, eu recomendaria o Shapedrawable.
Opção 3: 9 patches
Uma opção final é usar um drawable de 9 patches como este:

Você pode usá-lo em qualquer vista em que possa definir android:background="@drawable/...". E sim, precisa ser 6x6 - tentei 5x5 e não funcionou.
A desvantagem desse método é que você não pode alterar as cores com muita facilidade, mas se você deseja bordas sofisticadas (por exemplo, apenas uma borda na parte superior e inferior, como nesta pergunta), talvez não consiga fazê-las com o Shapedrawable , o que não é muito poderoso.
Opção 4: visualizações extras
Esqueci de mencionar essa opção realmente simples se você quiser apenas bordas acima e abaixo da sua visualização. Você pode colocar sua visualização em uma vertical LinearLayout(se ainda não estiver) e adicionar Views vazios acima e abaixo desta forma:
<View android:background="#000" android:layout_width="match_parent" android:layout_height="1px"/>