如何设置涉及标签的用户界面?

时间:2013-09-10 17:29:32

标签: android android-fragments tags onclick android-alertdialog

以下是我的目标: Image

我不确定我是否正确地这样做了。可能有更好,更有效,更清洁的方法,但我需要知道如何。

此布局采用xml设计,并通过inflater进行充气。然后将生成的视图放入AlertDialog中。因此,用户将其视为AlertDialog。

我关心的是底部的标签部分。我想让它像Tumblr标签一样工作。键入一个字符串,点击按钮,带有该标签名称的按钮将显示在它下面的空白部分。

现在,如果您点击这些按钮(带有各自的标签名称),它们将从框架中消失。

我有几个问题。

  1. 我无法实现侦听器。如果AddTag按钮在(当前不可见但现在)LinearLayout中创建了更多按钮,那么创建的按钮呢?这些按钮如何实现onClick侦听器,如果它们是在从AddTag按钮的onClick方法定义的某个内部方法中创建的,则会从LinearLayout中删除它们?

  2. 我担心必须将其中一些视图声明为FINAL才能在按钮方法和内部类中引用它们。我因此而陷入困境。

  3. 我是否必须为标签按钮定义自己的布局?你看,一个LinearLayout一个接一个地显示东西,是吗?我想尝试重新创建一些社交网站如何做到这一点。使用按钮从上到下,从左到右填充布局。如果当前行中没有剩余空间,请转到下一行并在此处添加标记按钮。它基本上是一个动态的LinearLayout,它具有自动包装功能。

  4. 如果有更好的方法可以实现这一点,请让我逐步了解如何做到这一点。我还没有学过碎片,但我认为它可能非常适用于此。另外,我应该创建一个扩展ViewGroup的类,在那里扩展XML,并添加帮助方法来处理事情吗?我想从DialogFragment然后我可以添加View(我刚创建的类)并从那里开始工作?

    顺便提一下,这是我当前的代码。我被困住了。

    /**
        * Opens a view for the user to define their new action and add it to the
        * dictionary.
        * 
        * @param view
        */
       public void defineNewAction(View view) {
          final AlertDialog.Builder builder = new AlertDialog.Builder(this);
          LayoutInflater inflater = this.getLayoutInflater();
          View viewToSet = inflater.inflate(
                R.layout.define_new_action_window_layout,
                null);      
    
          final EditText newActionName = (EditText) viewToSet
                .findViewById(R.id.set_action_name);
    
          final RadioGroup priorityGroup = (RadioGroup) viewToSet
                .findViewById(R.id.radiogroup_set_priority);
    
          final EditText goalTimeHours = (EditText) viewToSet
                .findViewById(R.id.set_goal_time_hours);
    
          final EditText goalTimeMinutes = (EditText) viewToSet
                .findViewById(R.id.set_goal_time_minutes);
    
          final EditText addTagsInput = (EditText) viewToSet
                .findViewById(R.id.add_tags_input);
          Button addTagButton = (Button) viewToSet.findViewById(R.id.btn_add_tags);
          final ArrayList<String> tags = new ArrayList<String>();
    
          final LinearLayout currentTagsLayout = (LinearLayout) viewToSet
                .findViewById(R.id.current_tags);
          addTagButton.setOnClickListener(new View.OnClickListener() {
    
             public void onClick(View v) {
                String tag = addTagsInput.getText().toString();
                tags.add(tag);
                Button newTag = new Button(builder.getContext());
                int tagId = tag.hashCode();
                if (tagId < 0)
                   tagId *= -1;
                newTag.setId(tagId);
    
                newTag.setOnClickListener(new View.OnClickListener() {
    
                   public void onClick(View v) {
                      Button toRemove = (Button) currentTagsLayout.findViewById(tagId);
                      currentTagsLayout.removeView(toRemove);
                   }
                });
    
                currentTagsLayout.addView(newTag);
             }
          });
    
          builder.setTitle("Define your action.");
          builder.setView(viewToSet);
          builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
    
             public void onClick(DialogInterface arg0, int arg1) {
                String name = newActionName.getText().toString();
                int priority = priorityGroup.getCheckedRadioButtonId();
                int goalHours = Integer
                      .parseInt(goalTimeHours.getText().toString());
                int goalMinutes = Integer.parseInt(goalTimeMinutes.getText()
                      .toString());
             }
    
          });
          builder.setNegativeButton("Cancel",
                new DialogInterface.OnClickListener() {
    
                   public void onClick(DialogInterface arg0, int arg1) {
    
                   }
                });
          AlertDialog dialog = builder.create();
          dialog.show();
       }
    

1 个答案:

答案 0 :(得分:1)

  

我无法实现监听器

没有问题。对于您尝试实现的功能,您可以继续添加按钮并在其上设置OnClickListeners。你甚至不需要给他们一个id,或以任何方式跟踪他们。 OnClickListener中的以下代码将执行:

newTag.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {

        // Use the View given to you
        currentTagsLayout.removeView(v);

    }
});
  

我担心必须将其中一些视图声明为FINAL

这就是Java的工作原理。我没有注意到这有任何严重的影响。您还可以将变量声明为全局变量,而不必将它们定义为final。但我不明白为什么将它们宣布为最终是一个问题。你能提供一个这个问题的例子吗?

  

我是否必须为标签按钮定义自己的布局?

这是你必须要处理的事情。这是一个设计决定。如果您需要自动换行支持,可以查看Android Flow LayoutLink。它是一个扩展的LinearLayout,支持自动换行其内容。

  

我还没有学过碎片,但我认为它可能非常糟糕   适用于此处

我不明白为什么会这样。

注意/旁白:这里的某种检查会更好:

String tag = "";

if (!addTagsInput.getText().toString().equals("")) {
    tag = addTagsInput.getText().toString();
} else {
    // handle empty string
}