2017-01-05 5 views
0

나는 이것에 대한 몇 가지 질문을 발견했다. 각 질문은 다른 프래그먼트와 관련이 있습니다. 프래그먼트에서 구현하지 않은 뷰는 프래그먼트를 가져올 필요가 없기 때문에 FragmentManager를 내 프래그먼트의 getChildFragmentManager()로 가져 오는 방법을 스왑해야하는 것은 아닙니다. 거기에 FragmentManager.FragmentTabHost 프래그먼트 어댑터가 탭으로 돌아 왔을 때 비어 있음, 조각 /보기가 남아 있음

내 문제는 주요 활동의 FragmentTabHost가 아닌 조각에서 비롯된 것으로 추측하고 있지만 실제로는 잘 모르겠습니다. 조금도. 탭 사이에서 페이지를 이동하면 어댑터 내용이 사라지지만 조각 자체는 사라집니다. 모든 뷰는 여전히 기능적이므로 각 프래그먼트의 기능은 그대로 유지됩니다.

채팅 조각 용 어댑터를 초기화 할 때 탭 변경 수신기를 추가 한 후에야이 문제가 발생했습니다.

탭의 내용은 처음 초기화 될 때 좋지만 탭으로 돌아 가면 어댑터의 내용이 비어 있음에 유의하십시오. 이것은 FragmentTabHost가 생성 될 때 아직 초기화되지 않은 탭, 숨겨진 탭이 아직 초기화되지 않았 음을 의미하므로 사용자가 처음으로 페이지를 넘길 때 여전히 작동합니다.

디버깅을 통해 전환이 발생할 때이 문제가 발생하고 모든 어댑터가 사용 기간 동안 비어있는 상태로 유지된다는 것을 알 수 있습니다. 내 tabHost.setOnTabChangedListener 호출에서 초기 검사 전에이 코드 SNIPPIT을 넣어 다음과 같이

//Before paging back to an initialized tab for the first time, the adapters of the initialized tab is populated. 
Log.d("test", "pre"); 
new Handler().postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     //At this point, the adapter is empty. 
     Log.d("test", "post"); 
    } 
}, 50); 

두 조각

은 다음과 같습니다

public class GroupTasksFragment extends Fragment { 

public ArrayAdapter<String> adapter; 
private Context context; 
public ListView taskListView; 

public GroupTasksFragment() { 
    // Required empty public constructor 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_group_tasks, container, false); 
    taskListView = (ListView) rootView.findViewById(R.id.tasksList); 
    adapter = new ArrayAdapter<>(context, android.R.layout.simple_list_item_1, new ArrayList<String>()); 
    taskListView.setAdapter(adapter); 
    return rootView; 
} 

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    this.context = context; 
} 

@Override 
public void onDetach() { 
    super.onDetach(); 
} 
} 

public class GroupChatFragment extends Fragment{ 

public ArrayAdapter<String> adapter; 
private Context context; 
public ListView chatListView; 

public GroupChatFragment() { 
    // Required empty public constructor 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_group_chat, container, false); 
    chatListView = (ListView) rootView.findViewById(R.id.chatList); 
    adapter = new ArrayAdapter<>(context, android.R.layout.simple_list_item_1, new ArrayList<String>()); 
    chatListView.setAdapter(adapter); 
    return rootView; 
} 

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    this.context = context; 
} 

@Override 
public void onDetach() { 
    super.onDetach(); 
} 
} 

FragmentTabHost의 주된 활동 (I 제외 한 방법을 그 단지) 입력을하고 PubNub에 내용을 보내

public class GroupContentActivity extends AppCompatActivity { 

private GroupChatFragment chatFrag; 
private GroupTasksFragment taskFrag; 
private FragmentTabHost tabHost; 
private PubNub connection; 
private String groupName; 
private String nickName; 
private boolean chatFragInitialized = false; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_group_content); 
    tabHost = (FragmentTabHost) findViewById(android.R.id.tabhost); 
    tabHost.setup(this, getSupportFragmentManager(), android.R.id.tabcontent); 

    tabHost.addTab(tabHost.newTabSpec("tasks").setIndicator("Tasks"), 
      GroupTasksFragment.class, null); 

    tabHost.addTab(tabHost.newTabSpec("chat") 
      .setIndicator("Chat"), GroupChatFragment.class, null); 

    groupName = getIntent().getStringExtra("groupName"); 
    nickName = getIntent().getStringExtra("nickName"); 
    PNConfiguration config = new PNConfiguration(); 
    config.setPublishKey(Constants.publishKey); 
    config.setSubscribeKey(Constants.subscribeKey); 
    connection = new PubNub(config); 



    tabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() { 
     @Override 
     public void onTabChanged(String tabId) { 
      if (!chatFragInitialized && tabId.equals("chat")) { 
       chatFragInitialized = true; 
       new Handler().postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         chatFrag = (GroupChatFragment) getSupportFragmentManager().findFragmentByTag("chat"); 
         connection.history() 
           .channel(groupName) 
           .count(50) 
           .async(new PNCallback<PNHistoryResult>() { 
            @Override 
            public void onResponse(PNHistoryResult result, PNStatus status) { 
             for (PNHistoryItemResult item : result.getMessages()) { 
              final String[] sForm = item.getEntry().getAsString().split(">>>>"); 
              String m = ""; 
              if (sForm.length > 2) { 
               for (int x = 1; x < sForm.length; x++) { 
                m += sForm[x]; 
               } 
              } else { 
               m = sForm[1]; 
              } 

              final String mCopy = m; 

              runOnUiThread(new Runnable() { 
               @Override 
               public void run() { 
                switch (sForm[0]) { 
                 case "groupCreated": 
                  chatFrag.adapter.clear(); 
                  break; 
                 case "chat": 
                  chatFrag.adapter.add(mCopy); 
                } 
               } 
              }); 

             } 
            } 
           }); 
        } 
       }, 50); 
      } 
     } 
    }); 

    new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      taskFrag = (GroupTasksFragment) getSupportFragmentManager().findFragmentByTag("tasks"); 

      connection.history() 
        .channel(groupName) 
        .count(50) 
        .async(new PNCallback<PNHistoryResult>() { 
         @Override 
         public void onResponse(PNHistoryResult result, PNStatus status) { 
          for (PNHistoryItemResult item : result.getMessages()) { 
           final String[] sForm = item.getEntry().getAsString().split(">>>>"); 
           String m = ""; 
           if (sForm.length > 2) { 
            for (int x = 1; x < sForm.length; x++) { 
             m += sForm[x]; 
            } 
           } else { 
            m = sForm[1]; 
           } 

           final String mCopy = m; 

           runOnUiThread(new Runnable() { 
            @Override 
            public void run() { 
             switch (sForm[0]) { 
              case "addTask": 
               if (taskFrag.adapter.getPosition(mCopy) < 0) { 
                taskFrag.adapter.add(mCopy); 
               } 
               break; 
              case "deleteTask": 
               if (taskFrag.adapter.getPosition(mCopy) >= 0) { 
                taskFrag.adapter.remove(mCopy); 
               } 
               break; 
              case "groupCreated": 
               taskFrag.adapter.clear(); 
               break; 
             } 
            } 
           }); 

          } 
         } 
        }); 

      connection.addListener(new SubscribeCallback() { 
       @Override 
       public void status(PubNub pubnub, PNStatus status) { 
        if (status.getCategory() == PNStatusCategory.PNUnexpectedDisconnectCategory) { 
         Toast.makeText(getApplicationContext(), "You were disconnected!", Toast.LENGTH_SHORT).show(); 
        } else if (status.getCategory() == PNStatusCategory.PNConnectedCategory) { 
         if (status.getCategory() == PNStatusCategory.PNConnectedCategory) { 
          pubnub.publish().channel(groupName).message("chat>>>><ADMIN> User '" + nickName + "' Connected").async(new PNCallback<PNPublishResult>() { 
           @Override 
           public void onResponse(PNPublishResult result, PNStatus status) { 
           } 
          }); 
         } 
        } else if (status.getCategory() == PNStatusCategory.PNReconnectedCategory) { 
         Toast.makeText(getApplicationContext(), "You were reconnected!", Toast.LENGTH_SHORT).show(); 
        } 
       } 

       @Override 
       public void message(PubNub pubnub, PNMessageResult message) { 
        final String[] sForm = message.getMessage().getAsString().split(">>>>"); 
        String m = ""; 
        if (sForm.length > 2) { 
         for (int x = 1; x < sForm.length; x++) { 
          m += sForm[x]; 
         } 
        } else { 
         m = sForm[1]; 
        } 

        final String mCopy = m; 

        runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          switch (sForm[0]) { 
           case "chat": 
            if (chatFragInitialized) { 
             chatFrag.adapter.add(mCopy); 
             runOnUiThread(new Runnable() { 
              @Override 
              public void run() { 
               chatFrag.chatListView.setSelection(chatFrag.adapter.getCount() - 1); 
              } 
             }); 
            } 
            break; 
           case "addTask": 
            taskFrag.adapter.add(mCopy); 
            connection.publish().channel(groupName).message("chat>>>><ADMIN> Task '" + mCopy + "' added.").async(new PNCallback<PNPublishResult>() { 
             @Override 
             public void onResponse(PNPublishResult pnPublishResult, PNStatus pnStatus) { 
             } 
            }); 
            break; 
           case "deleteTask": 
            taskFrag.adapter.remove(mCopy); 
            connection.publish().channel(groupName).message("chat>>>><ADMIN> Task '" + mCopy + "' deleted.").async(new PNCallback<PNPublishResult>() { 
             @Override 
             public void onResponse(PNPublishResult pnPublishResult, PNStatus pnStatus) { 
             } 
            }); 
            break; 
          } 
         } 
        }); 
       } 

       @Override 
       public void presence(PubNub pubnub, PNPresenceEventResult presence) { 
       } 
      }); 
      connection.subscribe().channels(java.util.Collections.singletonList(groupName)).execute(); 
     } 
    }, 100); 
} 

@Override 
public void onDestroy(){ 
    super.onDestroy(); 
    connection.publish().channel(groupName).message("chat>>>><ADMIN> User '" + nickName + "' Logged Out.").async(new PNCallback<PNPublishResult>() { 
     @Override 
     public void onResponse(PNPublishResult pnPublishResult, PNStatus pnStatus) { 
     } 
    }); 
    connection.disconnect(); 
    Toast.makeText(getApplicationContext(), "Logged out", Toast.LENGTH_SHORT).show(); 
} 

//More Methods 
} 

이 또한 문제가되지 않습니다 나는이의 FragmentManager 인스턴스를 저장할 필요가없는 점에 유의 뭐든지해라.

답변

0

문제점을 찾았습니다. FragmentTabHost에서 프래그먼트가 페이징 될 때마다 createView 메소드가 다시 호출되고 해당 메소드 만 표시되므로 프래그먼트의 어댑터를 비어있는 것으로 설정하면 해당 뷰에서 처음에 생각한 것입니다. 매번 어댑터를 재설정합니다.

어댑터 내용을 인스턴스 변수 목록 개체로 유지하여 어댑터를 변경하려고 할 때 문자열을 추가하거나 제거 할 수 있도록했습니다. 어댑터에 스트링을 넣지 마십시오. 목록을 업데이트하는 것으로 충분합니다. 목록은 어댑터에 직접 추가합니다.

조각의 외부에 초기 콘텐츠를 설정하면 탭을 처음 초기화 할 때 표시되지 않을 수도 있습니다. 귀하의 진술서 주문과 사물이 호출 될 때 조심하십시오. 단편 건축은 펑키 한 사업입니다.

그런 다음 createView 메소드가 호출 될 때마다 목록에있는 어댑터를 설정합니다.