Android:在Listview中使用PopupWindow时出现不同的主题

Sim*_*ngø 6 android

我在片段中有一个自定义列表视图,PopupWindow每当单击一条消息时,该视图就会使a膨胀。

但是,我似乎无法弄清楚为什么列表视图标题中的按钮使用的主题/样式与列表视图中的普通行不同。有人可以在乎解释吗?

列表视图项:

图片1

列表视图标题:

图片2

这就是我为工具栏充气的方式:

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)

QuestionFragment.java

@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)

MessagesAdapter.java

@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)

谢谢!

-西蒙

Edu*_* B. 6

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)