popup-AlertDialog错误地出现在其他片段中

时间:2018-04-14 16:48:44

标签: java android fragment alertdialog

我的java Project有4个片段。

其中一个片段是聊天室,当调用页面时,它将要求用户在popup-alertDialog中输入名称。

这是错误。当我将聊天室放到标签4时,标签3会在点击(Tab3)时错误地显示alertDialog。

当我将聊天室放到标签2时,标签1和标签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();
}

1 个答案:

答案 0 :(得分:1)

创建第4个片段时(在object-oriented方法内)

,您将显示弹出窗口

它是如何运作的?

有多个相关的事情引发了这个问题。

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

2 - ViewPager 的片段多于onCreate时,它不会创建更远的范围offsetPageLimit例如:如果您有4个将在开始时创建片段,第一个片段和第二个片段,当您选择第3个或第4个选项卡时将创建第4个片段。

3 - 当您选择第3个或第4个选项卡时,您将重新创建第4个片段并调用Fragments方法,然后最终调用onCreate。你的弹出窗口出现了。

首先,为方便起见,您可以将request_user_name()的offsetPage限制更改为4。

viewPager

其次,您需要在点击标签4 时调用viewPager.setOffscreenPageLimit(4); 方法,而不是第4个创建的片段。

您可以使用下面的request_user_name()

OnPageChangeListener

更多信息:

Link 1

Link 2