【问题标题】:Inflate a layout with ImageButton inside Fragment programmatically以编程方式在 Fragment 内使用 ImageButton 膨胀布局
【发布时间】:2012-04-20 04:11:34
【问题描述】:

我是 android 开发的新手,我目前正在创建一个使用 tabhost 和 TabActivity 来在不同活动之间切换的应用程序。这个应用程序运行良好,但我最近发现 TabActivity 已被弃用,我应该改用片段。

所以,我按照这个很棒的教程来解释如何做到这一点: 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()。

我确定,我错过了一些重要的事情,但我没有。任何建议将不胜感激。

提前致谢,

【问题讨论】:

    标签: android android-fragments android-tabhost


    【解决方案1】:

    如果您在膨胀布局中遇到问题,那么您可以使用以下代码:

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

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

    【讨论】:

    • 在我尝试过的方法中:btns = View.inflate(getActivity(), R.layout.mallmapactivity_level_buttons, null);我不能使用“this”,因为我的类扩展了一个片段,所以我改用“getActivity()”,但我不确定它是获取片段上下文的好方法。无论如何,这样做仍然会根据我的一般观点而不是根据我的片段来夸大我的观点
    • 实际上,使用 btns = View.inflate(v.getContext(), R.layout.mallmapactivity_level_buttons, myViewGroup);它的工作知道。谢谢
    • 为什么这个答案是-2?
    【解决方案2】:

    我有同样的问题,并在此链接中找到我的答案: problem with inflater

    你可以在没有任何依赖的情况下做到这一点

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      • 2017-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多