2012-04-20 64 views
7

我是android開發新手,我當前正在創建一個使用tabhost和TabActivity在不同活動之間切換的應用程序。此應用程序工作正常,但我最近發現TabActivity已被棄用,我應該使用片段。以編程方式在片段內用ImageButton膨脹佈局

於是,我按照這個偉大的教程,說明如何做到這一點: http://thepseudocoder.wordpress.com/2011/10/04/android-tabs-the-fragment-way/

它的大部分工作正常,但有我的問題,我的一些老活動,現在片段採用這種膨脹的ImageButton方法:

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

    } 

爲了能夠編譯的片段內該方法中,我改變:

LayoutInflater lf = getLayoutInflater(); 

LayoutInflater lf = getActivity().getLayoutInflater(); 

addContentView(btns,params); 

getActivity().addContentView(btns,params); 

但在使用我的方法displayLevelButtons()這個方法使我的按鈕出現在我的總的看法的右下角,而不是在我的片段的右下角

我也試圖指定根與圖像按鈕充氣我的佈局時,所有我的片段類看起來像這樣:

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

    } 

否則我的按鈕仍然在我的總圖的底部顯示不我的片段的底部,如果我嘗試了attachToRoot布爾值更改爲true:

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

我得到的錯誤:java.lang.IllegalStateException:指定的孩子已經有一個父。您必須先調用子對象的父對象的removeView()。

我相信,我錯過了一些重要的東西,但我什麼都沒有。任何建議將非常感激。

由於提前,

回答

12

如果你正面臨的問題在充氣佈局,那麼你可以使用下面的代碼:

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

這會給你完整的父佈局,那麼你可以使用該佈局來獲取什麼查看你想要的,或者你可以得到佈局參數,然後設置佈局參數爲任何意見(在你的情況按鈕,我認爲)。

+0

我想: btns = View.inflate(getActivity( ),R.layout。mallmapactivity_level_buttons,null); 我不能使用「this」,因爲我的類擴展了一個片段,所以我使用「getActivity()」來代替,但我不確定它是否是獲取片段上下文的好方法。 無論如何這樣做仍然膨脹我的看法根據我的一般看法,而不是根據我的片段 – Digoun 2012-04-20 05:19:41

+0

確實,使用btns = View.inflate(v.getContext(),R.layout.mallmapactivity_level_buttons,myViewGroup);它的工作知道。謝謝 – Digoun 2012-04-20 08:58:07

+0

我用列表視圖解決了幾個問題。歡迎.. – 2012-04-20 09:29:51

0

我有同樣的問題,找到我在這個環節答案: problem with inflater

你可以不用在我的方法,任何依賴

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