动态添加按钮到现有的按钮阵列

时间:2016-06-14 10:16:32

标签: android button

自从该人开始使用我的应用以来,我正在尝试为每年创建一个按钮。所以在我的xml文档中我有

     public class TemplatedFlyout:DependencyObject
        {
            public TemplatedFlyout()
            {

            }
            Popup popUp;
            FrameworkElement senderElement;
            FrameworkElement frameworkContent;
            bool keyboardOpen = false;
            InputPane keyboard;
            public void Initialization(UIElement sender)
            {
                senderElement = sender as FrameworkElement;
                senderElement.DataContextChanged += (s, e) =>frameworkContent.DataContext = senderElement.DataContext;
                popUp = new Popup()
                {
                    ChildTransitions = new Windows.UI.Xaml.Media.Animation.TransitionCollection(),
                    IsLightDismissEnabled = true
                };
                popUp.ChildTransitions.Add(new PaneThemeTransition() { Edge = EdgeTransitionLocation.Bottom });
                frameworkContent = Template as FrameworkElement;
                frameworkContent.DataContext = senderElement.DataContext;
                popUp.Child = frameworkContent;
                FocusKeeper();
             if(sender is RichEditBox || sender is TextBox)
                {
                    (sender as FrameworkElement).Loaded += TemplatedFlyout_Loaded;
                }
             //else
             //       sender.Tapped += (s, e) => Show(e);
            }

            private void TemplatedFlyout_Loaded(object sender, RoutedEventArgs e)
            {
                (sender as FrameworkElement).FindElementInVisualTree<ScrollViewer>().RightTapped += (s, e1) => Show(e1);
            }

           public static readonly DependencyProperty TemplateProperty = DependencyProperty.Register(nameof(Template), typeof(object), typeof(TemplatedFlyout), new PropertyMetadata(null));
            public object Template
            {
                get { return (object) GetValue(TemplateProperty); }
                set { SetValue(TemplateProperty, value); }
            }       
             void FocusKeeper()
            {
                keyboard = InputPane.GetForCurrentView();
                popUp.Closed += (s, e) =>
                {
                    if(keyboardOpen)
                    {
                        popUp.IsOpen = true;
                    }
                };
                if(keyboard!=null)
                {
                    keyboard.Showing += (s, e) => keyboardOpen = true;
                    keyboard.Hiding += (s, e) => keyboardOpen = false;
                }
            }
            public async void Show(RightTappedRoutedEventArgs args)
            {
                try
                {
                   popUp.RequestedTheme = ((Window.Current.Content as Frame).Content as Page).RequestedTheme;
                    popUp.IsOpen = true;
                    frameworkContent.UpdateLayout();
                    var top = Math.Abs(senderElement.ActualHeight+frameworkContent.ActualHeight+10-Window.Current.Bounds.Height);
                    var left = args.GetPosition(args.OriginalSource as UIElement).X;                
                    if (frameworkContent is Panel)
                    {
                        var panel = frameworkContent as Panel;
                        if (panel.Children.Any())
                        {
                            if (panel.Children.First() is Control)
                            {
                                (panel.Children.First() as Control).Focus(FocusState.Keyboard);
                            }
                        }
                    }                
                    popUp.SetValue(Canvas.TopProperty, top);
                    popUp.SetValue(Canvas.LeftProperty, left);

                }
                catch(Exception e)
                {

                }
            }       
        }

  public class Extensions:DependencyObject
    {

        public static void SetFlyout(UIElement element, TemplatedFlyout value)
        {
            element.SetValue(FlyoutProperty, value);
        }
        public static TemplatedFlyout GetFlyout(UIElement element)
        {
            return (TemplatedFlyout)element.GetValue(FlyoutProperty);
        }
        public static readonly DependencyProperty FlyoutProperty = DependencyProperty.Register(nameof(FlyoutProperty), typeof(TemplatedFlyout), typeof(Extensions), new PropertyMetadata(null, TemplateFlyoutChanged));

        private static void TemplateFlyoutChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var uiSender = d as UIElement;
            var flyout = e.NewValue as TemplatedFlyout;
            flyout.Initialization(uiSender);
        }
    }
    public static class VisualExtensions
    {       
        public static T FindElementInVisualTree<T>(this DependencyObject parentElement) where T : DependencyObject
        {
            var count = VisualTreeHelper.GetChildrenCount(parentElement);
            if (count == 0) return null;

            for (int i = 0; i < count; i++)
            {
                var child = VisualTreeHelper.GetChild(parentElement, i);
                if (child != null && child is T)
                    return (T)child;
                else
                {
                    var result = FindElementInVisualTree<T>(child);
                    if (result != null)
                        return result;
                }
            }
            return null;
        }
    }


<RichEditBox  IsRightTapEnabled="True"  >
                <local:Extensions.Flyout>
                    <local:TemplatedFlyout >
                        <local:TemplatedFlyout.Template>
                            <StackPanel>
                                <TextBlock Text="test1"/>
                                <TextBlock Text="test1"/>
                            </StackPanel>
                        </local:TemplatedFlyout.Template>
                    </local:TemplatedFlyout>
                </local:Extensions.Flyout>
            </RichEditBox>

然后我有以下代码

 <HorizontalScrollView
    android:id="@+id/yearScrollView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@color/white"
    android:layout_gravity="center">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/currentYear"
            android:tag="01"
            android:text="2015"
            android:paddingLeft="8.0dip"
            android:paddingRight="8.0dip"
            android:height="24dp"
            android:textSize="18sp"
            android:textColor="#333333"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@color/white"
            >
        </Button>


    </LinearLayout>

</HorizontalScrollView>

然后我必须找出它是哪一年并覆盖我当前的按钮

private List<Button> yearButtons;
private static final int[] YEAR_BUTTON_IDS = {
        R.id.currentYear,
};

然后在我的init类中我证实了按钮,我知道我不需要只有1个按钮的循环但是为了与月份按钮的工作方式保持一致而保留这个按钮

        int firstYear = Integer.parseInt(year);
                      yearButtons.get(0).setText(String.valueOf(CurrentYear));

然后我有一些逻辑来找出他们开始称为yearsOfTransactions的第一年

然后我有以下循环,我尝试创建按钮

for(int id : YEAR_BUTTON_IDS) {
        Button button = (Button)findViewById(id);
        button.setOnClickListener(this);
        yearButtons.add(button);
    }

然而这不起作用..

感谢您的帮助

4 个答案:

答案 0 :(得分:1)

我在你的代码中做了一些修改:

<HorizontalScrollView
    android:id="@+id/yearScrollView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@color/white"
    android:layout_gravity="center">

    <LinearLayout
        android:id="@+id/button_parent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/currentYear"
            android:tag="01"
            android:text="2015"
            android:paddingLeft="8.0dip"
            android:paddingRight="8.0dip"
            android:height="24dp"
            android:textSize="18sp"
            android:textColor="#333333"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@color/white"
            >
        </Button>


    </LinearLayout>

</HorizontalScrollView>

现在添加一些数组(在onCreate()中)

int[] yearToAdd = {2000, 2001, 2002, 2003};
LinearLayout parentLayout = (LinearLayout)findViewById(R.id.button_parent);
for (int i =0; i< yearToAdd.lenght; i++){
        int yearToAdd = yearToAdd[i];
        Button myButton = new Button(this);
        myButton.setText(String.valueOf(yearToAdd));
        yearButtons.add(myButton);
        yearButtons.setOnClickListener(this);
        parentLayout.addView(myButton);
 }

如果您需要更多的清洁,请告诉我,希望它会有所帮助:)

答案 1 :(得分:0)

您必须将按钮添加到线性布局。 这是我用来在线性布局中添加动态按钮的功能。

public Button createButton(String label) {
    Button button = new Button(mContext);
    button.setText(label);
    mDynamicLayout.addView(button, mLayoutParam);
    return button;
}

答案 2 :(得分:0)

您应该将您创建的每个按钮添加到LinearLayout。首先在xml中设置和id到LinearLayout。在课堂上找到视图,最后添加按钮。

LinearLayout container = findViewById(R.id.container);

//...

for (int i =0; i< yearsOfTransactions; i++){
    int yearToAdd = CurrentYear-i-1;
    Button myButton = new Button(this);
    myButton.setText(String.valueOf(yearToAdd));
    yearButtons.add(myButton);

   // you missed that
    container.addView(myButton);
}

答案 3 :(得分:0)

please try this inside your for loop

   LinearLayout layout = (LinearLayout) findViewById(R.id.linear_layout_tags);

    //set the properties for button
    Button btnTag = new Button(this);
    btnTag.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    btnTag.setText("Button");
    btnTag.setId(some_random_id);

    //add button to the layout
    layout.addView(btnTag);