以编程方式在片段中填充包含ImageButton的布局

7
我是一名Android开发新手,目前正在使用TabHost和TabActivity创建应用程序以在不同的活动之间切换。这个应用程序运行良好,但我最近发现TabActivity已被弃用,应该使用Fragment代替。
因此,我按照这篇很棒的教程进行操作: 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(); 

to

LayoutInflater lf = getActivity().getLayoutInflater();

并且

addContentView(btns,params);

to

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: The specified child already has a parent. You must call removeView() on the child's parent first.
我确定,我错过了一些重要的东西,但我不知道是什么。非常感谢您的任何建议。
先提前致谢。
2个回答

12

如果您在膨胀布局方面遇到问题,则可以使用以下代码:

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

这将为您提供完整的父布局,然后您可以使用该布局来获取您想要的任何视图,或者您可以获取布局参数,然后将布局参数设置到任何视图中(在您的情况下是按钮,我认为)。


在我的方法中,我尝试了以下代码: btns = View.inflate(getActivity(), R.layout.mallmapactivity_level_buttons, null); 我无法使用 "this",因为我的类扩展了一个 fragment,所以我使用 "getActivity()" 来代替,但我不确定这是获取 fragment 上下文的好方法。 无论如何,这样做仍然会根据我的通用视图而不是根据我的 fragment 填充我的视图。 - Digoun
使用btns = View.inflate(v.getContext(), R.layout.mallmapactivity_level_buttons, myViewGroup); 现在已经可以正常工作了。谢谢。 - Digoun
为什么这个答案是-2? - Bharat Sharma

0

我曾经遇到同样的问题,后来在这个链接中找到了答案: inflater的问题

你可以不依赖任何东西来解决它。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接