以编程方式将按钮添加到片段

Posted

技术标签:

【中文标题】以编程方式将按钮添加到片段【英文标题】:Adding buttons programmatically to a fragment 【发布时间】:2012-06-19 11:28:48 【问题描述】:

我正在尝试以编程方式将图像按钮添加到作为 viewpager 一部分的片段中。我尝试了不同的代码,但即使 Eclipse 没有返回错误,也没有显示任何按钮。

我发现了一个类似的问题here,但答案并没有帮助我让我的按钮出现。

这是我的代码。

public class ViewPagerFragment extends Fragment 

private ViewPagerActivity mViewPagerActivity;
private String mId;

public ViewPagerFragment(String id) 
    mId = id;


@Override
public void onAttach(Activity activity) 
    if (activity instanceof ViewPagerActivity) 
        mViewPagerActivity = (ViewPagerActivity)activity;
    
    super.onAttach(activity);


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    View v = inflater.inflate(R.layout.fragment, container, false);

     int[] image_array = 
            R.drawable.elebutton,
            R.drawable.right,
            R.drawable.middle,
            ;

     for (int i =0;i<image_array.length;i++)
            ImageButton b1 = new ImageButton(getActivity());
            b1.setId(100 + i);
             b1.setImageResource(image_array[i]);

            RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
            if (i > 0) 
                lp.addRule(RelativeLayout.BELOW, b1.getId() - 1);
               
            b1.setLayoutParams(lp);

            ImageHolder ih = new ImageHolder(getActivity());
            ih.addView(b1);


    

    return v;


public class ImageHolder extends FrameLayout 

    public ImageHolder(Context context) 
        super(context);
        initView(context);
    

    public ImageHolder(Context context, AttributeSet attrs) 
        super(context, attrs);
        initView(context);
    

    public ImageHolder(Context context, AttributeSet attrs, int defStyle) 
        super(context, attrs, defStyle);
        initView(context);
    

    private void initView(Context context)
        View.inflate(context, R.layout.fragment, this); 
    

   @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) 
        // TODO Auto-generated method stub
        for(int i = 0 ; i < getChildCount() ; i++)
            getChildAt(i).layout(l, t, r, b);
        
    


【问题讨论】:

似乎您在 ih 对象中添加按钮,您还为每个按钮创建了一个 ImageHolder 并且您没有向您的真实布局视图 v 添加任何内容。所以也许不是添加 b1在 ih 中,您应该将其添加到 v => v.addView(b1) 中。让我知道这是否有意义并对您有帮助。 【参考方案1】:

您似乎正在创建 i 数量的图像,并将它们中的每一个添加到图像持有者。但是,我没有看到您将图像持有者实际加入主布局的任何部分。所以基本上,这些都是创建的,但没有添加到任何地方。让我们假设您的 R.layout.fragment 只有一个 ID 为 frameLayout1 的 FrameLayout。以下是我的建议:

public class ViewPagerFragment extends Fragment 

private ViewPagerActivity mViewPagerActivity;
private String mId;

public ViewPagerFragment(String id) 
    mId = id;


@Override
public void onAttach(Activity activity) 
    if (activity instanceof ViewPagerActivity) 
        mViewPagerActivity = (ViewPagerActivity)activity;
    
    super.onAttach(activity);


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    return inflater.inflate(R.layout.fragment, container, false);

// IMPORTANT PART! Here we will add images after fragment is inflated and instantiated
@Override
public void onActivityCreated(Bundle savedInstanceState) 
    // Get the root layout of fragment, we called it frameLayout1
    FrameLayout fl = (FrameLayout)(this.getActivity.findViewById(R.id.frameLayout1));
    int[] image_array = 
            R.drawable.elebutton,
            R.drawable.right,
            R.drawable.middle,
            ;

     for (int i =0;i<image_array.length;i++)
            ImageButton b1 = new ImageButton(getActivity());
            b1.setId(100 + i);
             b1.setImageResource(image_array[i]);

            RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
            if (i > 0) 
                lp.addRule(RelativeLayout.BELOW, b1.getId() - 1);
               
            b1.setLayoutParams(lp);

            ImageHolder ih = new ImageHolder(getActivity());
            ih.addView(b1);
            fl.addView(ih);
    

// End of important part
public class ImageHolder extends FrameLayout ...

【讨论】:

【参考方案2】:

你可以参考我在Adding button to fragments dynamically的回答。

基本上在你的 onCreateView 方法上,实现这个。此外,您的 ImageButton 不应使用 getActivity(),而应使用 yourView.getContext()

View myView = inflater.inflate(R.layout.fragment, container, false);

 for (int i = 0; i < image_array.length; i++) 

            final ImageButton b1 = new ImageButton(myView.getContext());
            b1.setImageResource(image_array[i]);
            b1.setId(i + 1);
            b1.setOnClickListener(this);

//Change the linearlayout to relative layout for your context
//you should set another layout within your R.layout.fragment
            LinearLayout linearlayout = (LinearLayout) myView.findViewById(R.id.btnholder); 
            linearlayout.setOrientation(LinearLayout.VERTICAL);

            LinearLayout.LayoutParams buttonParams = new LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.MATCH_PARENT,
                    LinearLayout.LayoutParams.WRAP_CONTENT);
            buttonParams.setMargins(left, top, right, btm);

            linearlayout.addView(b1, buttonParams);

希望这会有所帮助。当我创建普通按钮时,我有一段时间遇到同样的问题。如果你还需要什么,请告诉我:)。

【讨论】:

以上是关于以编程方式将按钮添加到片段的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 XML 的情况下以编程方式将片段添加到活动

以编程方式将多个片段添加到 RelativeLayout

以编程方式将片段添加到android中的框架布局

Android:以编程方式在片段中添加多个 RecyclerView

显示/隐藏片段并以编程方式更改可见性属性

以编程方式将按钮添加到导航栏