java - popup-AlertDialog 错误地出现在其他 fragment 中

标签 java android fragment android-alertdialog

我的java项目有4个 fragment 。

其中一个 fragment 是一个聊天室,当页面被调用时,它会要求用户在弹出警报对话框中输入名称。

这是错误。当我将聊天室置于选项卡 4 时,单击选项卡 3(选项卡 3)时,选项卡 3 将错误地显示警报对话框。

当我把聊天室放到Tab 2时,Tab 1和Tab 3也会出现同样的问题。

这对我来说很棘手,我不知道错误从哪里来。

这是我的chatroom.java

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    v = inflater.inflate(R.layout.tab_match_chatroom, container, false);
    add_room = (Button) v.findViewById(R.id.btn_add_room);
    room_name = (EditText) v.findViewById(R.id.room_name_edittext);
    listView = (ListView) v.findViewById(R.id.listView);
    listView.setAdapter(arrayAdapter);

    add_room.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Map<String, Object> map = new HashMap<String, Object>();
            map.put(room_name.getText().toString(), "");
            root.updateChildren(map);
        }
    });
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

            Intent intent = new Intent(getActivity().getApplicationContext(), TabInChatRoom.class);
            intent.putExtra("room_name", ((TextView) view).getText().toString());
            intent.putExtra("user_name", name);
            startActivity(intent);
        }
    });
    return v;
}

public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    arrayAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, list_of_rooms);
    request_user_name();

    root.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Set<String> set = new HashSet<String>();
            Iterator i = dataSnapshot.getChildren().iterator();
            while (i.hasNext()) {
                set.add(((DataSnapshot) i.next()).getKey());
            }
            list_of_rooms.clear();
            list_of_rooms.addAll(set);
            arrayAdapter.notifyDataSetChanged();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });
}

private void request_user_name() {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setTitle("Enter name:");

    final EditText input_field = new EditText(getActivity());

    builder.setView(input_field);
    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            name = input_field.getText().toString();
        }
    });

    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            dialogInterface.cancel();
            request_user_name();
        }
    });

    builder.show();
}

最佳答案

创建第 4 个 fragment 时(在 onCreate 方法内),您将显示弹出窗口

它是如何工作的?

有多个相关的事情触发了该问题。

1- ViewPager 有偏移页面限制,默认值为 1(一次 3 个选项卡)。您可以更改该值。这意味着,您的 viewPager 仅从当前页面的左侧创建 1 个,从右侧创建 1 个。当您选择范围限制内的 fragment 时,其他 fragment 将被销毁并重新创建。

2-ViewPager 的 fragment 多于 offsetPageLimit 时,它不会创建进一步的范围 Fragments例如:如果您有 4 个 fragment ,则将在开始时创建第一个 fragment 和第二个 fragment ,当您选择第三个或第四个选项卡时将创建第四个 fragment 。

3- 当您选择第三个或第四个选项卡时,您将重新创建第四个 fragment ,它会调用 onCreate方法,然后调用 request_user_name()最终。然后您的弹出窗口就会出现。

首先,您可以更改 viewPager为了方便起见,将 offsetPage 限制为 4。

viewPager.setOffscreenPageLimit(4);

其次,您需要调用request_user_name()单击 Tab 4 时的方法,而不是创建的第 4 个 fragment 。

您可以使用OnPageChangeListener如下所示:

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            if(position == 3){
                //that means 4th tab
                //show the popup
            }
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

更多信息:

Link 1

Link 2

关于java - popup-AlertDialog 错误地出现在其他 fragment 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49833846/

相关文章:

java - 如何让 JList 项目显示在 JTextField 中

java - 使用Hibernate将文件保存在mysql数据库中

java - bufferwriter 不适用于 java 服务器和 android 客户端

android - 如何根据android中的edittext值更新listview

android - 丑陋的 fragment 过渡到带有覆盖的表面 View

java - J2ME getDisplay() 方法

java - For 循环使用 Thread.Sleep 跳过两次迭代

android - ViewPager 中使用的 Fragment 内的 ListView 的行为与预期不符

java - 在适配器和 fragment 中获取正确的上下文

java - 具有多个升序值列表的数字排序