Pergunta

Quero adicionar uma vista dentro de um Framelayout programaticamente e colocá -la em um ponto específico dentro do layout com uma largura e altura específicas. O Framelayout suporta isso? Caso contrário, devo usar um grupo de vista intermediário para conseguir isso?

int x; // Can be negative?
int y; // Can be negative?
int width;
int height;
View v = new View(context);
// v.setLayoutParams(?); // What do I put here?
frameLayout.addView(v);

Minha idéia inicial era adicionar um absolutolayout ao Framelayout e colocar a vista dentro do Absolutelayout. Infelizmente, acabei de descobrir que o Absolutelayout está preso.

Quaisquer indicadores serão muito apreciados. Obrigado.

Foi útil?

Solução

É verdade que, com o Framelayout, todas as crianças estão atreladas ao canto superior esquerdo da tela, mas você ainda tem algum controle com o estabelecimento de seu preenchimento. Se você definir valores diferentes de preenchimento para crianças diferentes, elas aparecerão em lugares diferentes no Framelayout.

Outras dicas

O exemplo a seguir (código de trabalho) mostra como colocar uma visualização (EditText) dentro de um Framelayout. Ele também mostra como definir a posição do EdittExt usando o setPadding Setter do Framelayout (toda vez que o usuário clica no Framelayout, a posição do EditText é definida na posição do clique):

public class TextToolTestActivity extends Activity{
    FrameLayout frmLayout;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        frmLayout = (FrameLayout)findViewById(R.id.frameLayout1);
        frmLayout.setFocusable(true);
        EditText et = new EditText(this);

        frmLayout.addView(et,100,100);
        frmLayout.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                Log.i("TESTING","touch x,y == " + event.getX() + "," +     event.getY() );
                frmLayout.setPadding(Math.round(event.getX()),Math.round(event.getY()) , 0, 0);
            return true;
        }
    });

}

}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <FrameLayout 
        android:id="@+id/frameLayout1" 
        android:layout_height="fill_parent" android:layout_width="fill_parent">
    </FrameLayout>

</LinearLayout>

Você também pode adicionar uma margem em torno da visualização recém -adicionada para posicioná -la dentro do Framelayout.

FrameLayout frameLayout = (FrameLayout) findViewById(R.id.main); // or some other R.id.xxx
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.setMargins(0, metrics.heightPixels - 20, 0, 0);
View v = new View(context);
v.setLayoutParams(params);
frameLayout.addView(v);

Isso posicionará o Framelayout 20 pixels da parte inferior da tela.

Editar: completou o exemplo para que ele se mantenha por si só. E oh, sim, funciona.

De link Quinn1000 fornecido:

Você pode adicionar vários filhos a um Framelayout, mas todas as crianças estão atingidas no canto superior esquerdo da tela.

Isso significa que você não pode colocar sua visão em um ponto específico dentro do Framelayout (exceto que deseja que esteja no canto superior esquerdo :-)).

Se você precisar do posicionamento absoluto da visão, tente o Absolutelayout:

Um layout que permite especificar locais exatos (coordenadas X/Y) de seus filhos. Os layouts absolutos são menos flexíveis e mais difíceis de manter do que outros tipos de layouts sem posicionamento absoluto.

Quanto a definir a largura e a altura da vista, também como Quinn1000 disse, você fornece o v.setLayoutParams() Método a LayoutParams objeto, dependendo do contêiner que você escolheu (absolutElayout, linearlayout, etc.)

O tópico aqui no StackOverflow em

Como você setLayoutParams () para um ImageView?

cobre um pouco.

Por exemplo: linearlayout.layoutparams layoutParams = new linearlayout.layoutparams (30, 30); yourImageView.setLayoutParams (layoutParams);

Implica que você precisa definir um objeto LinearLayout.LayoutParams (ou no seu caso, um objeto Framelayout.layoutParams) para passar para o método setLayoutParams do seu objeto V.

No

http://developer.android.com/reference/android/widget/framelayout.html

Quase faz parecer que você poderia pedir ao seu V:

GeneratedefaultLayoutParams () através deste método, se você não tiver definido os parâmetros especificamente.

Mas é tarde, e esses links estão fazendo meus olhos sangrarem um pouco. Deixe-me saber se eles não

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top