popup-AlertDialog 错误地出现在其他片段中
popup-AlertDialog wrongly appear in other fragment
我的 java 项目有 4 个片段。
其中一个片段是一个聊天室,它会要求用户在调用页面时在弹出的警告对话框中输入名称。
这是错误。当我把聊天室放到 Tab 4 时,点击 Tab 3 (Tab3) 时会错误地显示 alertDialog。
当我把聊天室放到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 个片段时显示弹出窗口(在 onCreate
方法内)
效果如何?
有多个相关事件触发了该问题。
1- ViewPager 有偏移页面限制,默认值为 1(3 个标签立刻)。您可以更改此值。这意味着,您的 viewPager 仅从当前页面的左侧创建 1 个,从右侧创建 1 个。当您 select 在范围限制内碎片时,其他人将被销毁并重新创建。
2- 当 ViewPager 的片段多于 offsetPageLimit
时,它不会创建更多的范围 Fragments
例如:如果您有 4 个片段,第一个片段和第二个片段将在开始时创建,第 4 个片段将在您 select 编辑第 3 个或第 4 个选项卡时创建。
3- 当您 select 第 3 个或第 4 个选项卡时,您正在重新创建第 4 个片段,它调用 onCreate
方法,然后调用request_user_name()
终于。你的弹出窗口出现了。
首先,为了方便起见,您可以将 viewPager
s offsetPage 限制更改为 4。
viewPager.setOffscreenPageLimit(4);
其次,您需要在 Tab 4 单击时调用 request_user_name()
方法,而不是创建的第 4 个片段。
您可以像下面这样使用 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) {
}
});
更多信息:
我的 java 项目有 4 个片段。
其中一个片段是一个聊天室,它会要求用户在调用页面时在弹出的警告对话框中输入名称。
这是错误。当我把聊天室放到 Tab 4 时,点击 Tab 3 (Tab3) 时会错误地显示 alertDialog。
当我把聊天室放到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 个片段时显示弹出窗口(在 onCreate
方法内)
效果如何?
有多个相关事件触发了该问题。
1- ViewPager 有偏移页面限制,默认值为 1(3 个标签立刻)。您可以更改此值。这意味着,您的 viewPager 仅从当前页面的左侧创建 1 个,从右侧创建 1 个。当您 select 在范围限制内碎片时,其他人将被销毁并重新创建。
2- 当 ViewPager 的片段多于 offsetPageLimit
时,它不会创建更多的范围 Fragments
例如:如果您有 4 个片段,第一个片段和第二个片段将在开始时创建,第 4 个片段将在您 select 编辑第 3 个或第 4 个选项卡时创建。
3- 当您 select 第 3 个或第 4 个选项卡时,您正在重新创建第 4 个片段,它调用 onCreate
方法,然后调用request_user_name()
终于。你的弹出窗口出现了。
首先,为了方便起见,您可以将 viewPager
s offsetPage 限制更改为 4。
viewPager.setOffscreenPageLimit(4);
其次,您需要在 Tab 4 单击时调用 request_user_name()
方法,而不是创建的第 4 个片段。
您可以像下面这样使用 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) {
}
});
更多信息: