使用gitlab issue board的四种方式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用gitlab issue board的四种方式相关的知识,希望对你有一定的参考价值。
参考技术A 构建软件和运行项目的方法有很多种。当我们开始在 GitLab 中构建产品组合和项目管理工具时,我们问自己,“您如何构建工具来支持各种工作流程,而不会因为工具本身的复杂性而陷入瘫痪?我们的结论是什么?构建更少但更灵活的工具。GitLab 的内置issue board是一个很好的例子,说明选择构建单个多功能工具可以显著降低工具维护的复杂性,同时不会限制其功能。管理项目和软件本质上是复杂的,但项目管理工具本身不一定如此复杂。无论您管理多少个项目、人员或产品,获得保持平稳运行所需的可见性应该是一件容易的事。
GitLab issue board是一个使用简化方法解决复杂问题的很好的例子。我们建立在 GitLab 现有的问题跟踪功能之上,并利用 GitLab 问题标签的强大功能,将它们用作看板上的列表。您可以构建不同的问题板视图,同时保持您在问题跟踪器中看到的相同过滤和排序功能。您可以创建多个板来捕获所需可见性,并按里程碑、标签、责任人和权重定义板的范围。
issue board基于其项目的标签结构,因此,它应用相同的描述性标签来定位在板上的位置,从而在整个开发生命周期中保持一致性。而且,您可以直接从开发板中单击某个问题以开始您的工作。
issue board显示您的团队正在处理哪些问题,分配给每个问题的人员以及这些问题在工作流中的哪个位置
无论您是试图掌握项目状态的项目经理,还是需要报告进度的产品经理,工作流可视性都至关重要。
要创建工作流issue,只需为工作流的每个阶段创建标签,然后将其作为列表添加到版块上即可。标记问题后,该问题将自动显示在列表中。当问题准备好进入下一阶段时,只需将其拖放到下一个列表中即可。您也可以直接在问题中更新标签,您的更改将自动显示在版块上。
例如,您的工作流可能如下所示:
要在看板上看到这一点,只需为每个阶段创建一个标签即可。创建一个新版块并为每个阶段添加一个列表。您可以拖放列表以按所需顺序放置它们.
与工作流视图类似,您可以基于类别创建 GitLab 问题板。
在处理特定产品或功能时,您可能希望获得每个团队正在处理的内容的高阶视图。您可以为每个团队创建一个标签和一个列表,或者,您可能希望查看许多项目或产品线中正在处理的内容。
在上面的示例中,我们有三个标签列表:时间跟踪、项目组合管理和描述模板。每个列表代表一个特定的产品区域。因此,通过这一个板子,您将能够看到哪些未解决的问题属于这三个领域。如果您将board进一步限定为特定里程碑,您将能够看到在该里程碑中要处理的问题中有哪些问题。
这只是如何使用issue board来规划工作的一个示例。同样,由于问题板是使用标签创建的,因此您的选择是无限的!
您可以使用团队成员列表轻松监控分配给团队中个人的内容。团队成员列表显示分配给特定成员的问题,您可以创建一个版块来为团队中的每个人显示列表,以便快速查看谁在做什么。
作为我们项目管理能力的一部分,我们建立了里程碑。里程碑用于跟踪与要在特定时间范围内完成的特定目标相关联的问题和合并请求。
与我们的受托人列表类似,您将能够直接从您的issue board快速创建里程碑视图。这对于那些利用敏捷工作流的人来说特别有用。使用里程碑列表,您可以轻松地在不同里程碑(即sprint,迭代)之间移动问题(story)。
4 ways to use GitLab Issue Boards
Button的四种监听方式
Button按钮设置点击的四种监听方式
注:加粗放大的都是改变的代码
1.使用匿名内部类的形式进行设置
使用匿名内部类的形式,直接将需要设置的onClickListener接口对象初始化,内部的onClick方法会在按钮被点击的时候执行
第一个活动的java代码:
1 package com.sanlian.buttontest; 2 3 import android.content.Intent; 4 import android.support.v7.app.AppCompatActivity; 5 import android.os.Bundle; 6 import android.view.View; 7 import android.widget.Button; 8 9 public class MainActivity extends AppCompatActivity { 10 11 @Override 12 protected void onCreate(Bundle savedInstanceState) { 13 super.onCreate(savedInstanceState); 14 setContentView(R.layout.activity_main); 15 //通过id找到关联布局中的view控件 16 Button btn = (Button) findViewById(R.id.btn); 17 //给Button按钮添加点击的监听 18 btn.setOnClickListener(new View.OnClickListener() { 19 @Override 20 //只要当前的设置的监听器被触发,这个方法就会被执行 21 public void onClick(View v) { 22 startActivity(new Intent(MainActivity.this,SecondAty.class)); 23 } 24 }); 25 } 26 }
第一个活动的xml代码:
1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 android:paddingBottom="@dimen/activity_vertical_margin" 7 android:paddingLeft="@dimen/activity_horizontal_margin" 8 android:paddingRight="@dimen/activity_horizontal_margin" 9 android:paddingTop="@dimen/activity_vertical_margin" 10 tools:context="com.sanlian.buttontest.MainActivity" 11 > 12 13 <Button 14 android:id="@+id/btn" 15 android:layout_width="wrap_content" 16 android:layout_height="wrap_content" 17 android:text="点我"/> 18 </RelativeLayout>
第二个活动的java代码:
1 package com.sanlian.buttontest; 2 3 import android.support.v7.app.AppCompatActivity; 4 import android.os.Bundle; 5 import android.text.SpannableString; 6 import android.text.style.StyleSpan; 7 import android.text.style.TypefaceSpan; 8 import android.widget.TextView; 9 10 public class SecondAty extends AppCompatActivity { 11 12 @Override 13 protected void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15 setContentView(R.layout.activity_second_aty); 16 17 18 19 } 20 }
第二个活动的xml代码:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.sanlian.buttontest.SecondAty"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="这是第二个activty"/> </RelativeLayout>
程序运行结果截图:
2.在xml文件中定义onClick属性,java代码中对应方法
在xml中定义onClick属性。属性中对应的值需要在java代码中编写对应的方法名。
注意:参数中的View必须-----》方法类似于:public void xxx(View v)
第一个活动的java代码 :
1 package com.sanlian.buttontest; 2 3 import android.content.Intent; 4 import android.support.v7.app.AppCompatActivity; 5 import android.os.Bundle; 6 import android.view.View; 7 import android.widget.Button; 8 9 public class MainActivity extends AppCompatActivity { 10 11 @Override 12 protected void onCreate(Bundle savedInstanceState) { 13 super.onCreate(savedInstanceState); 14 setContentView(R.layout.activity_main); 15 } 16 public void skip(View v){ 17 startActivity(new Intent(MainActivity.this,SecondAty.class)); 18 } 19 20 21 }
第一个活动的xml代码:
1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 android:paddingBottom="@dimen/activity_vertical_margin" 7 android:paddingLeft="@dimen/activity_horizontal_margin" 8 android:paddingRight="@dimen/activity_horizontal_margin" 9 android:paddingTop="@dimen/activity_vertical_margin" 10 tools:context="com.sanlian.buttontest.MainActivity" 11 > 12 13 <Button 14 android:id="@+id/btn" 15 android:layout_width="wrap_content" 16 android:layout_height="wrap_content" 17 android:onClick="skip" 18 android:text="点我"/> 19 </RelativeLayout>
其他的和匿名内部类的方法一样。
3.Activity 实现onClickListener接口
在给Button按钮设置点击的监听的时候直接让当前的Activity实现onClickListener接口,这样传入的监听对象就可以直接使用当前Activity.this
第一个活动的java代码:
1 package com.sanlian.buttontest; 2 3 import android.content.Intent; 4 import android.support.v7.app.AppCompatActivity; 5 import android.os.Bundle; 6 import android.view.View; 7 import android.widget.Button; 8 9 public class MainActivity extends AppCompatActivity implements View.OnClickListener { 10 11 @Override 12 protected void onCreate(Bundle savedInstanceState) { 13 super.onCreate(savedInstanceState); 14 setContentView(R.layout.activity_main); 15 //找到控件的id,也叫控件的初始化 16 Button btn = (Button) findViewById(R.id.btn); 17 //给Button按钮设置监听 18 btn.setOnClickListener(this); 19 } 20 21 22 23 public void onClick(View v) { 24 //启动另一个activity 25 startActivity(new Intent(MainActivity.this,SecondAty.class)); 26 27 //使用swith查找要点击的按钮的id 28 /*switch (v.getId()){ 29 case R.id.btn: 30 startActivity(new Intent(MainActivity.this,SecondAty.class)); 31 break; 32 default: 33 break; 34 }*/ 35 } 36 }
第一个活动的xml代码:
1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 android:paddingBottom="@dimen/activity_vertical_margin" 7 android:paddingLeft="@dimen/activity_horizontal_margin" 8 android:paddingRight="@dimen/activity_horizontal_margin" 9 android:paddingTop="@dimen/activity_vertical_margin" 10 tools:context="com.sanlian.buttontest.MainActivity" 11 > 12 13 <Button 14 android:id="@+id/btn" 15 android:layout_width="wrap_content" 16 android:layout_height="wrap_content" 17 android:text="点我"/> 18 </RelativeLayout>
其他的和第一个方法一样
4.其他类实现onClickListener接口
让另外一个类来实现onClickListener接口。这样如果控件在需要设置点击监听的时候,直接传入该类的对象即可。
第一个活动的java代码:
1 package com.sanlian.buttontest; 2 3 import android.content.Intent; 4 import android.support.v7.app.AppCompatActivity; 5 import android.os.Bundle; 6 import android.util.Log; 7 import android.view.View; 8 import android.widget.Button; 9 10 public class MainActivity extends AppCompatActivity{ 11 12 @Override 13 protected void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15 setContentView(R.layout.activity_main); 16 //找到控件的id,也叫控件的初始化 17 Button btn = (Button) findViewById(R.id.btn); 18 Button btn2 = (Button) findViewById(R.id.btn2); 19 //给Button按钮设置监听 20 myListener mylistener = new myListener(); 21 btn.setOnClickListener(mylistener); 22 btn2.setOnClickListener(mylistener); 23 } 24 class myListener implements View.OnClickListener { 25 @Override 26 //参数v:就是触发点击的View控件。在这里就是被点击了Button按钮 27 public void onClick(View v) { 28 switch(v.getId()){ 29 case R.id.btn: 30 Log.i("TAG","你点击了button1按钮"); 31 break; 32 case R.id.btn2: 33 Log.i("TAG","你点击了button2按钮"); 34 } 35 36 } 37 } 38 39 }
第一个活动的xml代码:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 android:paddingBottom="@dimen/activity_vertical_margin" 7 android:paddingLeft="@dimen/activity_horizontal_margin" 8 android:paddingRight="@dimen/activity_horizontal_margin" 9 android:paddingTop="@dimen/activity_vertical_margin" 10 tools:context="com.sanlian.buttontest.MainActivity" 11 > 12 13 <Button 14 android:id="@+id/btn" 15 android:layout_width="wrap_content" 16 android:layout_height="wrap_content" 17 android:text="点我"/> 18 19 <Button 20 android:id="@+id/btn2" 21 android:layout_width="wrap_content" 22 android:layout_height="wrap_content" 23 android:text="点我"/> 24 25 26 </LinearLayout>
实现的结果截图:
以上是关于使用gitlab issue board的四种方式的主要内容,如果未能解决你的问题,请参考以下文章
RocketMQ(13)——指定NameServer的四种方式