2012-04-20 19 views
7

Soy nuevo en el desarrollo de Android, y actualmente estaba creando una aplicación que usa tabhost y TabActivity para cambiar entre diferentes actividades. Esta aplicación funcionaba bien, pero recientemente descubrí que TabActivity está en desuso y que debería usar un fragmento en su lugar.Inflar un diseño con ImageButton dentro de Fragment programmatically

Por lo tanto, seguir este gran tutorial que explica cómo hacerlo: http://thepseudocoder.wordpress.com/2011/10/04/android-tabs-the-fragment-way/

La mayor parte se trabaja muy bien, pero no es mi problema algunos de mis viejos actividades que ahora son fragmentos fueron inflando ImageButton el uso de este tipo de métodos:

private void displayLevelButtons() { 
    LayoutInflater lf = getLayoutInflater();    
     btns = lf.inflate(R.layout.mallmapactivity_level_buttons, null, false); 

     mBtnLevelDown = (ImageButton) btns.findViewById(R.id.btn_level_down); 
     mBtnLevelUp = (ImageButton) btns.findViewById(R.id.btn_level_up); 

     mBtnLevelDown.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View view) {     
       levelDown(); 
       updateLevelButtons(); 
      } 
     }); 
     mBtnLevelUp.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       levelUp(); 
       updateLevelButtons(); 
      } 
     }); 

     LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
     params.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL | Gravity.RIGHT;    
     addContentView(btns,params); 

    } 

con el fin de ser capaz de compilar este método dentro de un fragmento, he cambiado:

LayoutInflater lf = getLayoutInflater(); 

a

LayoutInflater lf = getActivity().getLayoutInflater(); 

y

addContentView(btns,params); 

a

getActivity().addContentView(btns,params); 

Pero el uso de mi método displayLevelButtons() como este hacen mis botones aparece en la parte inferior derecha de mi punto de vista general, y no en la parte inferior derecha de mi fragmento.

También probé para especificar una raíz al inflar mi diseño con botones de imagen, mi toda clase fragmento con este aspecto:

public class MyFragment extends Fragment { 

    private View btns;   
    private ImageButton mBtnLevelUp; 
    private ImageButton mBtnLevelDown; 
    private ViewGroup myViewGroup; 

@Override 
    public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     if (container == null) { 
      return null; 
     } 
     myViewGroup = container; 
     v = inflater.inflate(R.layout.mallmaptile, container, false);   
     return v; 
    } 

@Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     //Do some stuff and then : 
      displayLevelButtons();   

    } 

private void displayLevelButtons() { 
     LayoutInflater lf = getActivity().getLayoutInflater();   
     btns = lf.inflate(R.layout.mallmapactivity_level_buttons, myViewGroup, false); 

     mBtnLevelDown = (ImageButton) btns.findViewById(R.id.btn_level_down); 
     mBtnLevelUp = (ImageButton) btns.findViewById(R.id.btn_level_up); 

     mBtnLevelDown.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View view) {      
       levelDown(); 
       updateLevelButtons(); 
      } 
     }); 
     mBtnLevelUp.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       levelUp(); 
       updateLevelButtons(); 
      } 
     }); 

     LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
     params.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL | Gravity.RIGHT;    
     getActivity().addContentView(btns,params); 

    } 

Si lo hace, mis botones se siguen mostrando en la parte inferior de mi punto de vista general, no en el fondo de mi fragmento, y si trato de cambiar el valor booleano true attachToRoot:

btns = lf.inflate(R.layout.mallmapactivity_level_buttons, myViewGroup, true); 

me sale el error: java.lang.IllegalStateException: el niño especificado ya tiene un padre. Primero debe llamar a removeView() en el padre del niño.

Estoy seguro, extrañé algo importante pero no sé qué. Cualquier sugerencia sería realmente apreciada.

Gracias de antemano,

Respuesta

12

Si se enfrentan a un problema en el inflado de diseño, puede utilizar siguiente código:

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

esto le dará el diseño de los padres completa, podrá utilizar esa disposición a buscar lo que sea visualice lo que quiere o puede obtener el parámetro de diseño y luego establecer el parámetro de diseño para cualquier punto de vista (en su caso, creo que el botón).

+0

en mi método he intentado: btns = View.inflate (getActivity (), R.layout.mallmapactivity_level_buttons, null); No puedo usar "esto" porque mi clase amplía un fragmento, así que uso "getActivity()" en su lugar, pero no estoy seguro de que sea el mejor método para obtener el contexto de mi fragmento. De todos modos, sigue inflando mi punto de vista de acuerdo con mi opinión general no según mi fragmento – Digoun

+0

Ok en realidad, usando btns = View.inflate (v.getContext(), R.layout.mallmapactivity_level_buttons, myViewGroup); está trabajando sabe. Gracias – Digoun

+0

He resuelto varios problemas usando esto en la vista de lista. Bienvenido ... –

0

que tenía el mismo problema y encontrar mi respuesta en este enlace: problem with inflater

que puede hacerlo sin ninguna dependencia

LayoutInflater inflater = LayoutInflater.from(getContext()); 
inflater.inflate(R.layout.view_with_merge_tag, this); 
Cuestiones relacionadas