Autore Topic: Costrutto inusuale  (Letto 616 volte)

Offline oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Costrutto inusuale
« il: 12 Dicembre 2015, 08:55:05 CET »
0
Mi sono imbattutto in un costrutto per me inusuale:

Ho un file XML cosi':
********** activity_main.xml **********
Codice (XML): [Seleziona]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:id="@+id/container"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical"
   tools:context="com.example.androidsurfaceview.MainActivity" >

    <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_gravity="center_horizontal"
       android:autoLink="web"
       android:text="http://android-er.blogspot.com/"
       android:textStyle="bold" />

    <com.example.androidsurfaceview.MySurfaceView
       android:layout_width="match_parent"
       android:layout_height="match_parent" />

</LinearLayout>

Nel file XML c'e' la seguente scritta:
"<com.example.androidsurfaceview.MySurfaceView"

la classe "MySurfaceView" NON e' presente nel file MainActivity:
********** MainActivity.java **********
Codice (Java): [Seleziona]
package com.example.androidsurfaceview;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }
}

EPPURE viene chiamata.
********** MySurfaceView.java **********
Codice (Java): [Seleziona]
package com.example.androidsurfaceview;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class MySurfaceView extends SurfaceView {

    private SurfaceHolder surfaceHolder;
    private Bitmap bmpIcon;

    public MySurfaceView(Context context) {
        super(context);
        init();
    }

    public MySurfaceView(Context context,
                         AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public MySurfaceView(Context context,
                         AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init(){
        surfaceHolder = getHolder();
        bmpIcon = BitmapFactory.decodeResource(getResources(),
                R.drawable.ic_launcher);
        surfaceHolder.addCallback(new SurfaceHolder.Callback(){

            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                Canvas canvas = holder.lockCanvas(null);
                drawSomething(canvas);
                holder.unlockCanvasAndPost(canvas);
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder,
                                       int format, int width, int height) {
                // TODO Auto-generated method stub

            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                // TODO Auto-generated method stub

            }});
    }

    protected void drawSomething(Canvas canvas) {
        canvas.drawColor(Color.BLACK);
        canvas.drawBitmap(bmpIcon,
                getWidth()/2, getHeight()/2, null);
    }

}

(ricordarsi di aggiungere alla cartella "drawable" il file "ic_launcher.png")

COME MAI?

Ho provato a aggiungere al file "activity_main.xml" la classe "ProvaActivity" cosi'
********** activity_main.xml **********
Codice (XML): [Seleziona]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:id="@+id/container"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical"
   tools:context="com.example.androidsurfaceview.MainActivity" >

    <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_gravity="center_horizontal"
       android:autoLink="web"
       android:text="http://android-er.blogspot.com/"
       android:textStyle="bold" />

    <com.example.androidsurfaceview.MySurfaceView
       android:layout_width="match_parent"
       android:layout_height="match_parent" />

   
   <com.example.androidsurfaceview.ProvaActivity>
       android:layout_width="100dp"
       android:layout_height="100dp"
   </com.example.androidsurfaceview.ProvaActivity>
   

</LinearLayout>

ma il programma a run-time collassa.

La classe "ProvaActivity" e' questa:
********** ProvaActivity.java **********
Codice (Java): [Seleziona]
package com.example.androidsurfaceview;

import android.util.Log;

public class ProvaActivity
{
    public ProvaActivity()
    {
        Log.d("***","ProvaActivity");
    }
}

Qualcuno mi spiega questo costrutto?

Offline tonno16

  • Utente storico
  • *****
  • Post: 1187
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Costrutto inusuale
« Risposta #1 il: 12 Dicembre 2015, 09:11:00 CET »
0
Io non ho capito niente di quello che hai scritto.

Inoltre
Codice (Java): [Seleziona]
  <com.example.androidsurfaceview.ProvaActivity>
       android:layout_width="100dp"
       android:layout_height="100dp"
   </com.example.androidsurfaceview.ProvaActivity>

è scritto in maniera non corretta

Offline oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Re:Costrutto inusuale
« Risposta #2 il: 12 Dicembre 2015, 12:49:23 CET »
0
Nel file XML c'e' scritto
 <com.example.androidsurfaceview.MySurfaceView
ma nel file Java "MainActivity.java" NON c'e' nessun riferimento a "MySurfaceView"

EPPURE la classe "MySurfaceView" viene regolarmente CHIAMATA, COME MAI?
---------------------------------
Ho provato a inserire nel file XML la scritta
   <com.example.androidsurfaceview.ProvaActivity>
ma il programma a run-time collassa, COME MAI?

Ditemi se mi sono spiegato bene.


Post unito: [time]12 Dicembre 2015, 12:54:21 CET[/time]
Ho provato a sostituire

<com.example.androidsurfaceview.ProvaActivity>
       android:layout_width="100dp"
       android:layout_height="100dp
</com.example.androidsurfaceview.ProvaActivity>

con

<com.example.androidsurfaceview.ProvaActivity
       android:layout_width="100dp"
       android:layout_height="100dp"
/>

ma e' tutto uguale a prima.


Post unito: 12 Dicembre 2015, 13:08:21 CET
In sostanza, con

<com.example.androidsurfaceview.MySurfaceView

la classe "MySurfaceView" viene chiamata, mentre con

<com.example.androidsurfaceview.ProvaActivity

NON solo la classe "ProvaActivity" NON viene chiamata, ma a run-time ottengo errore.

Ditemi se mi sono spiegato bene.
« Ultima modifica: 12 Dicembre 2015, 13:08:21 CET da oberdank, Reason: Merged DoublePost »

Offline tonno16

  • Utente storico
  • *****
  • Post: 1187
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Costrutto inusuale
« Risposta #3 il: 12 Dicembre 2015, 13:19:16 CET »
0
Non ti sei spiegato bene.
Metti caso che io uso una texview fatta da me.
Nel xml acro <com.miopackage.MyTextView>

Offline oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Re:Costrutto inusuale
« Risposta #4 il: 12 Dicembre 2015, 13:25:12 CET »
0
Puoi dirmi, per favore, COSA nella mia spiegazione non hai capito?


Post unito: 12 Dicembre 2015, 15:29:11 CET
Ho provato a cambiare "ProvaActivity.java" rendendola una View, ma e' tutto uguale a prima, a run-time il
programma collassa.

********** ProvaActivity.java **********
Codice (Java): [Seleziona]
package com.example.androidsurfaceview;

import android.content.Context;
import android.util.Log;
import android.view.SurfaceView;
import android.widget.TextView;

public class ProvaActivity extends SurfaceView
{
    public ProvaActivity(Context c)
    {
        super(c);
    }
}
« Ultima modifica: 12 Dicembre 2015, 15:29:11 CET da oberdank, Reason: Merged DoublePost »

Offline oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Re:Costrutto inusuale
« Risposta #5 il: 13 Dicembre 2015, 13:26:50 CET »
0
Qualcuno puo' spiegarmi quel costrutto per me inusuale?

Offline oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Re:Costrutto inusuale
« Risposta #6 il: 14 Dicembre 2015, 13:28:35 CET »
0
Nessuno puo' rispondermi?

Offline iClaude

  • Utente normale
  • ***
  • Post: 183
  • Respect: +13
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Costrutto inusuale
« Risposta #7 il: 14 Dicembre 2015, 14:09:40 CET »
+1
Con l'istruzione <com.example.androidsurfaceview.MySurfaceView
inserisci nel layout una viewb personalizzata definita nella classe MySurfaceView che si trova nel package com.example.androidsurfaceview

Così puoi inserire delle view nel tuo layout, non puoi inserire un Activity.
Inoltre le view personalizzate devono implementare determinati metodi ed avere determinate caratteristiche: non basta semplicemente creare una classe che estende la classe view: per questo il tuo programma crasha.

Offline oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Re:Costrutto inusuale
« Risposta #8 il: 14 Dicembre 2015, 15:51:28 CET »
0
Grazie iClaude della spiegazione.
La spiegazione NON e' esaustiva (non dici quali metodi e caratteristiche le classi devono avere) comunque ti ho aumentato di un punto il "Respect".

Potresti mica spiegarmi i metodi e caratteristiche che le classi che estendono View devono avere?
E' una cosa che dipende da che View viene estesa?

Offline iClaude

  • Utente normale
  • ***
  • Post: 183
  • Respect: +13
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Costrutto inusuale
« Risposta #9 il: 14 Dicembre 2015, 16:22:26 CET »
0
É una cosa abbastanza complessa,  non si può spiegare in poche righe.
Cmq qua trovi la guida ufficiale completa: Creating Custom Views | Android Developers