我在片段中有一个自定义列表视图,PopupWindow每当单击一条消息时,该视图就会使a膨胀。
但是,我似乎无法弄清楚为什么列表视图标题中的按钮使用的主题/样式与列表视图中的普通行不同。有人可以在乎解释吗?
popup = new PopupWindow(inflater.inflate(R.layout.message_tool, null, false));
popup.setWindowLayoutMode(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
popup.setOutsideTouchable(true);
Rect location = locateView(v);
popup.showAtLocation(v, Gravity.NO_GRAVITY, location.left, location.top - 200);
Run Code Online (Sandbox Code Playgroud)
@Nullable
@Override
public View onCreateView(final LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
final LinearLayout view = (LinearLayout) inflater.inflate(R.layout.fragment_question, container, false);
final ListView messages = (ListView)view.findViewById(R.id.messages);
messages.setDivider(null);
// Add question (header)
View headerView = inflater.inflate(R.layout.messages_question, null);
MessageModel messageItem = new MessageModel();
messageItem.message = question.getQuestion();
messageItem.id = question.getId();
messageItem.gender = question.getGender();
messageItem.name = question.getName();
LinearLayout messageBackground = (LinearLayout)headerView.findViewById(R.id.messageBackground);
TextView message = (TextView)headerView.findViewById(R.id.question);
int bgDrawable = (messageItem.gender > 1) ? R.drawable.bubble_red_left_states : R.drawable.bubble_blue_left_states;
messageBackground.setBackground(ContextCompat.getDrawable(getActivity().getApplicationContext(), bgDrawable));
messages.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
SingleInstancePopup.GetInstance().hidePopup();
}
});
messageBackground.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(getClass().getName(), "Clicked on question");
SingleInstancePopup popup = SingleInstancePopup.GetInstance();
if(popup.getPopup() != null) {
popup.hidePopup();
} else {
popup.showPopup(inflater, v);
}
}
});
message.setText(messageItem.message);
messages.addHeaderView(headerView, null, false);
// Add footer
View footerView = inflater.inflate(R.layout.messages_footer, null);
messages.addFooterView(footerView, null, false);
messagesAdapter = new MessagesAdapter(getActivity().getApplicationContext());
messages.setAdapter(messagesAdapter);
final Handler handler_ = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == UPDATE_UI) {
QuestionModel question = (QuestionModel) msg.obj;
for (AnswerModel answer : question.getAnswers()) {
MessageModel messageItem = new MessageModel();
messageItem.message = answer.getComment();
messageItem.id = answer.getId();
messageItem.gender = answer.getGender();
messageItem.name = answer.getName();
messageItem.reply = (answer.getParentId() > 0);
messagesAdapter.add(messageItem);
}
ProgressBar progress = (ProgressBar) messages.findViewById(R.id.messagesProgress);
if (progress != null) {
progress.setVisibility(View.GONE);
}
messagesAdapter.notifyDataSetChanged();
}
}
};
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
QuestionModel q = QuestionModel.getById(question.getId());
handler_.sendMessage(Message.obtain(handler_, UPDATE_UI, q));
} catch (Exception e) {
Log.d(getClass().getName(), "Failed to load question", e);
}
}
});
thread.start();
return view;
}
Run Code Online (Sandbox Code Playgroud)
@Override
public View getView(int position, View convertView, final ViewGroup parent) {
final LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final MessageModel messageItem = this.getItem(position);
View v;
int bgDrawable;
if(messageItem.reply) {
v = inflater.inflate(R.layout.messages_answer_reply, null, false);
bgDrawable = (messageItem.gender > 1) ? R.drawable.bubble_red_right_states : R.drawable.bubble_blue_right_states;
} else {
v = inflater.inflate(R.layout.messages_answer, null, false);
bgDrawable = (messageItem.gender > 1) ? R.drawable.bubble_red_left_states : R.drawable.bubble_blue_left_states;
}
LinearLayout messageBackground = (LinearLayout)v.findViewById(R.id.messageBackground);
TextView message = (TextView)v.findViewById(R.id.comment);
messageBackground.setBackground(ContextCompat.getDrawable(getContext(), bgDrawable));
message.setText(messageItem.message);
messageBackground.setClickable(true);
messageBackground.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(getClass().getName(), "Pressing down on message");
SingleInstancePopup popup = SingleInstancePopup.GetInstance();
if(popup.getPopup() != null) {
popup.hidePopup();
} else {
popup.showPopup(inflater, v);
}
}
});
return v;
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
-西蒙
在MessagesAdapter.java中,inflater没有活动的主题,这就是按钮外观不同的原因。无需获取系统扩展器服务,而是将活动的布局扩展器传递给适配器,如下所示:
QuestionFragment.java
messagesAdapter = new MessagesAdapter(getActivity().getApplicationContext(), getActivity().getLayoutInflater());
Run Code Online (Sandbox Code Playgroud)
MessagesAdapter.java 私有LayoutInflater充气器;
public MessagesAdapter(Context context, LayoutInflater inflater) {
super(context, 0);
this.inflater = inflater;
}
@Override
public View getView(int position, View convertView, final ViewGroup parent) {
final MessageModel messageItem = this.getItem(position);
View v;
int bgDrawable;
if (messageItem.reply) {
v = inflater.inflate(R.layout.messages_answer_reply, null, false);
bgDrawable = (messageItem.gender > 1) ? R.drawable.bubble_red_right_states : R.drawable.bubble_blue_right_states;
} else {
v = inflater.inflate(R.layout.messages_answer, null, false);
bgDrawable = (messageItem.gender > 1) ? R.drawable.bubble_red_left_states : R.drawable.bubble_blue_left_states;
}
// .......
return v;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
739 次 |
| 最近记录: |