Domanda

Voglio aggiungere una vista all'interno di un FrameLayout di programmazione e di collocarlo in un punto specifico all'interno del layout con una larghezza e un'altezza specifica. Ha FrameLayout sostenere questo? In caso contrario, dovrei usare un ViewGroup intermedia per raggiungere questo obiettivo?

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);

La mia idea iniziale era quella di aggiungere un AbsoluteLayout al FrameLayout e posizionare la vista all'interno del AbsoluteLayout. Purtroppo ho appena scoperto che AbsoluteLayout è deprecato.

Tutti gli indicatori sarà molto apprezzato. Grazie.

È stato utile?

Soluzione

E 'vero che con FrameLayout tutti i bambini sono ancorato alla parte superiore sinistra dello schermo, ma avete ancora un certo controllo con l'impostazione loro imbottitura. Se si imposta diversi valori imbottitura a diversi bambini, si riveleranno in diversi posti nel FrameLayout.

Altri suggerimenti

Il seguente esempio (codice di lavoro) mostra come posizionare una vista (EditText) all'interno di un FrameLayout. Inoltre mostra come impostare la posizione del EditText utilizzando il setter setPadding del FrameLayout (ogni volta che l'utente fa clic sul FrameLayout, la posizione del EditText è impostato alla posizione del click):

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>

Si può anche aggiungere un margine intorno la vista appena aggiunto per posizionarlo all'interno del 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);

Questo posizionerà i FrameLayout 20 pixel dalla parte inferiore dello schermo.

Modifica completato l'esempio in modo che sta a sé. E, oh, sì, funziona.

link Quinn1000 fornito:

  

È possibile aggiungere più figli a una FrameLayout, ma tutti i bambini sono ancorato alla parte superiore sinistra dello schermo.

Questo significa che non si può mettere la vostra vista in un punto specifico all'interno del FrameLayout (tranne che si desidera che sia in alto a sinistra: -))

.

Se è necessario il posizionamento assoluto della vista, provare la AbsoluteLayout :

  

Un layout che consente di specificare l'esatta posizione (X / Y coordinate) dei suoi figli. layout assolute sono meno flessibili e più difficile da mantenere rispetto ad altri tipi di layout senza posizionamento assoluto.

Per quanto riguarda l'impostazione della larghezza e l'altezza della vista, come anche Quinn1000 detto, si fornisce il metodo v.setLayoutParams() un LayoutParams oggetto, a seconda del contenitore si è scelto (AbsoluteLayout, LinearLayout, ecc.)

Il thread qui su StackOverflow a

Come si fa a setLayoutParams () per un ImageView?

coperture in qualche modo.

Per esempio: LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams (30, 30); yourImageView.setLayoutParams (layoutParams);

implica che è necessario essere che definisce un LinearLayout.LayoutParams (o nel tuo caso a FrameLayout.layoutParams) oggetto di passare al metodo setLayoutParams del V dell'oggetto.

A

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

fa quasi sembra che si potrebbe chiedere il vostro v a:

generateDefaultLayoutParams () tramite questo metodo se non hai definito i parametri specificamente.

Ma è tardi, e quei collegamenti stanno facendo i miei occhi sanguinare un po '. Fatemi sapere se Nhelp qualsiasi: -)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top