2012-04-20 11 views
7

Ich bin neu auf Android-Entwicklung, und ich war im Moment erstellen eine Anwendung mit Tabhost und TabActivity, um zwischen verschiedenen Aktivitäten zu wechseln. Diese Anwendung funktionierte gut, aber ich habe kürzlich entdeckt, dass TabActivity veraltet ist und ich stattdessen Fragment verwenden sollte.Ein Layout mit ImageButton in Fragment programmatisch aufblasen

So folge ich dieses große Tutorial erklärt, wie man dies tun: http://thepseudocoder.wordpress.com/2011/10/04/android-tabs-the-fragment-way/

meisten es funktioniert gut, aber es ist mein Problem einige meiner alten Aktivitäten sind, die jetzt wurden Fragmente Image mit dieser Art Aufblasen von Methoden:

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

    } 

sein, um die Lage, dieses Verfahren in einem Fragmente zu kompilieren, geändert I:

LayoutInflater lf = getLayoutInflater(); 

zu

LayoutInflater lf = getActivity().getLayoutInflater(); 

und

addContentView(btns,params); 

zu

getActivity().addContentView(btns,params); 

Aber meiner Methode displayLevelButtons() verwenden, wie dies erscheint in der rechten unteren Ecke meiner allgemeinen Ansicht meine Knöpfe zu machen, nicht in die rechte Unterseite meines Fragments.

Ich habe auch versucht, eine Wurzel zu spezifizieren, wenn mein Layout mit Bild Tasten aufbläst, alle meine Klasse Fragment wie folgt aussehen:

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

    } 

Doing so noch meine Tasten sind im Grunde meines allgemeine Ansicht angezeigt werden nicht in die Unterseite meines Fragments, und wenn ich versuche, den attachToRoot boolean Wert auf true zu ändern:

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

ich den Fehler: java.lang.IllegalStateException: das angegebene Kind hat bereits einen Elternteil. Sie müssen zuerst removeView() für das übergeordnete Element des Kindes aufrufen.

Ich bin sicher, ich habe etwas wichtiges verpasst, aber ich weiß nicht was. Irgendwelche Vorschläge würden wirklich geschätzt.

Vielen Dank im Voraus,

Antwort

12

Wenn Sie Problem konfrontiert sind in Aufpumpen Layout dann können Sie folgenden Code verwenden:

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

das Ihnen das Layout komplett Eltern geben, dann können Sie dieses Layout verwenden zu holen was auch immer sehen Sie wollen, oder Sie können Layout-Param und dann Layout-Param auf alle Ansichten (in Ihrem Fall Taste, denke ich).

+0

in meiner Methode habe ich versucht: btns = View.inflate (getActivity (), R.layout.mallmapactivity_level_buttons, null); Ich kann "this" nicht verwenden, weil meine Klasse ein Fragment erweitert, also verwende ich stattdessen "getActivity()", aber ich bin mir nicht sicher, ob es die gute Methode ist, meinen Fragmentkontext zu erhalten. Auf jeden Fall noch meine Ansicht aufblasen nach meiner allgemeinen Ansicht nicht nach meinem Fragment – Digoun

+0

Ok eigentlich, mit btns = View.inflate (v.getContext(), R.layout.mallmapactivity_level_buttons, myViewGroup); es funktioniert weiß. Danke – Digoun

+0

Ich habe mehrere Probleme in der Listenansicht gelöst. Willkommen .. –

0

Ich hatte dasselbe Problem und finden meine Antwort in diesem Link: problem with inflater

Sie es ohne Abhängigkeit tun

LayoutInflater inflater = LayoutInflater.from(getContext()); 
inflater.inflate(R.layout.view_with_merge_tag, this); 
Verwandte Themen