2012-05-08 29 views
6

Sto cercando di creare la mia vista personalizzata tramite xml, ma lo schermo non mostra la mia vista, s non si sta gonfiando. La mia vista personalizzata XML è come:Visualizzazione personalizzata non gonfiaggio

<?xml version="1.0" encoding="utf-8"?> 
<ViewSwitcher xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/profileSwitcher" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#FFFFFF" > 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" > 

     <ImageView 
      android:id="@+id/imgAdvertise" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:src="@android:drawable/btn_minus" /> 
    </LinearLayout> 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:gravity="center_horizontal" > 

     <TextView 
      android:id="@+id/txtAdvertise" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:text="asdas" /> 
    </LinearLayout> 

</ViewSwitcher> 

ho la mia classe personalizzata View come:

public class MyCustomView extends View{ 

    TextView textAdvertise; 
    ImageView imageAdvertise; 
    View view; 
    ViewSwitcher switcher ; 

    public MyCustomView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     // TODO Auto-generated constructor stub 

     LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     if (layoutInflater != null) { 
      view = layoutInflater.inflate(R.layout.main, null); 

     } 

     initialize(); 
    } 

    public void initialize() { 
     // TODO Auto-generated method stub 

     textAdvertise = (TextView) view.findViewById(R.id.txtAdvertise); 
     imageAdvertise = (ImageView) view.findViewById(R.id.imgAdvertise); 
     switcher = (ViewSwitcher) view.findViewById(R.id.profileSwitcher); 
     startAnimation(); 

    } 

    public void startAnimation() { 
     // TODO Auto-generated method stub 

     new Thread() { 
      public void run() { 

       for (;;) { 
        try { 

         Thread.sleep(2000); 
         hRefresh.sendEmptyMessage(5); 
        } catch (Exception e) { 
        } 
       } 
      } 
     }.start(); 
    } 

    Handler hRefresh = new Handler() { 
     public void handleMessage(Message msg) { 
      switch (msg.what) { 
      case 5: 
       switcher.showNext(); 
       // To go back to the first view, use switcher.showPrevious() 
       break; 
      default: 
       break; 
      } 
     } 
    }; 

} 

e nel mio layout xml base dove devo mostrare il View, è un pulsante e la mia View come:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" > 

<Button 
    android:id="@+id/button1" 
    android:layout_width="fill_parent" 
    android:layout_height="0dp" 
    android:text="Button" 
    android:layout_weight="1"/> 

<com.example.viewswitcher.MyCustomView 
    android:id="@+id/MyView" 
    android:layout_width="fill_parent" 
    android:layout_height="0dp" 
    android:layout_weight="1" 

    /> 

Può chiunque per favore dimmi cosa sta andando storto?

risposta

9

Non vedrete nulla perché MyCustomView non ha alcun contenuto come lo avete scritto. Prima di tutto vorrei utilizzare uno dei ViewGroups figli invece di View (come LinearLayout, RelativeLayout ecc):

public class MyCustomView extends LinearLayout { 

    TextView textAdvertise; 
    ImageView imageAdvertise; 
    View view; 
    ViewSwitcher switcher ; 

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

    public MyCustomView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     if (layoutInflater != null) { 
      view = layoutInflater.inflate(R.layout.main, this, true); 
     } 
     initialize(); 
    } 

    public MyCustomView(Context context, AttributeSet attrs, int theme) { 
     super(context, attrs, theme); 
    } 
// ... 
+1

Hey grazie per l'aiuto .. Ha funzionato .. In realtà nel mio layout inflator ho scritto view = layoutInflater.inflate (R.layout.main, null); questo null causa problemi .. invece metto "questo" ha funzionato .. grazie amico !! – NullPointerException

+0

quale modifica hai fatto in questione ... e un'altra cosa ha funzionato perché ho esteso LinearLayout invece di vista .. perchè così ?? Qualsiasi link o post relativo a questo dettaglio .. grazie – NullPointerException

+2

@Rashmi Ho modificato la tua domanda per formattare meglio il codice della domanda. La classe 'View' rappresenta un singolo oggetto' View', non accetta i 'View's dei bambini come se si provasse ad aggiungerli con il metodo' inflate' (infatti se si guarda al metodo 'inflate' i documenti vedrai che il secondo parametro è un 'ViewGroup'). Invece un 'ViewGroup' (' LinearLayout' è una sottoclasse di 'ViewGroup') rappresenta un' View' (in effetti è una sottoclasse della 'classe' di super-classe) che accetta i' Views' dei bambini. Non conosco collegamenti, ma puoi consultare i documenti per 'View' e' ViewGroup'. – Luksprog

0

Penso che quello che avete bisogno non è una vista personalizzata. Forse dovresti ereditare dalla classe Fragment insted di View.

Look here per come implementare un proprio frammento.

+0

I frammenti scusi non sono utili nel mio caso .. perché devo dare compatibilità alla mia app da Android 2.1 – NullPointerException

+0

È possibile utilizzare Android Support Package. [collegamento] (http://developer.android.com/sdk/compatibility-library.html). La versione minima è 4 (1,6, penso). – gutiory

3

Da utilizzare per gonfiare il layout. Modifica

View headerView = View.inflate(this, R.layout.layout_name, null); 

Ciò restituirà il layout genitore del file XML, è possibile utilizzare direttamente o si può trovare qualsiasi altra vista utilizzando

Modifica

headerView.findViewById(R.id.view_id); 

Spero che funzionerà

Problemi correlati