以下是我的目标:
我不确定我是否正确地这样做了。可能有更好,更有效,更清洁的方法,但我需要知道如何。
此布局采用xml设计,并通过inflater进行充气。然后将生成的视图放入AlertDialog中。因此,用户将其视为AlertDialog。
我关心的是底部的标签部分。我想让它像Tumblr标签一样工作。键入一个字符串,点击按钮,带有该标签名称的按钮将显示在它下面的空白部分。
现在,如果您点击这些按钮(带有各自的标签名称),它们将从框架中消失。
我有几个问题。
我无法实现侦听器。如果AddTag按钮在(当前不可见但现在)LinearLayout中创建了更多按钮,那么创建的按钮呢?这些按钮如何实现onClick侦听器,如果它们是在从AddTag按钮的onClick方法定义的某个内部方法中创建的,则会从LinearLayout中删除它们?
我担心必须将其中一些视图声明为FINAL才能在按钮方法和内部类中引用它们。我因此而陷入困境。
我是否必须为标签按钮定义自己的布局?你看,一个LinearLayout一个接一个地显示东西,是吗?我想尝试重新创建一些社交网站如何做到这一点。使用按钮从上到下,从左到右填充布局。如果当前行中没有剩余空间,请转到下一行并在此处添加标记按钮。它基本上是一个动态的LinearLayout,它具有自动包装功能。
如果有更好的方法可以实现这一点,请让我逐步了解如何做到这一点。我还没有学过碎片,但我认为它可能非常适用于此。另外,我应该创建一个扩展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();
}
答案 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 Layout
:Link。它是一个扩展的LinearLayout,支持自动换行其内容。
我还没有学过碎片,但我认为它可能非常糟糕 适用于此处
我不明白为什么会这样。
注意/旁白:这里的某种检查会更好:
String tag = "";
if (!addTagsInput.getText().toString().equals("")) {
tag = addTagsInput.getText().toString();
} else {
// handle empty string
}