누구나 내게 아래의 문제에 대한 해결책을 말해 줄 수 있습니까? 파편을 사용하여 여러 채팅 창을 열고 싶은 간단한 채팅 응용 프로그램을 만들었습니다. 이 작업을 수행했지만 이제는 문제가 채팅 조각을 분리 할 수 없으므로 모두 서로 겹칩니다. 버튼을 최소화하고 최대화하여 이러한 조각을 개별적으로 만들 수 있도록 솔루션을 제안하십시오. 코드 스 니펫 (snippet)을 제공하면 내가 adroid 개발에 익숙해 져서 도움이 될 것입니다.조각이 겹쳐서 조각을 최대화하고 최소화하는 해결책이 필요합니다.
감사합니다. & ragards, Anand Jagtap.
나는 탭 리스너를 사용하고 채팅 기록을 정적 변수에 저장하여 수행했습니다.
/// <summary>
/// Listener that handles the selection of a tab in the user interface
/// </summary>
/// <typeparam name="T"></typeparam>
public class TabListener<T> : Java.Lang.Object, ActionBar.ITabListener
where T : Fragment
{
private T _fragment;
/// <summary>
/// Initializes a new instance of the tab listener
/// </summary>
/// <param name="fragment"></param>
public TabListener(T fragment)
{
_fragment = fragment;
}
/// <summary>
/// Handles the reselection of the tab
/// </summary>
/// <param name="tab"></param>
/// <param name="ft"></param>
public void OnTabReselected(ActionBar.Tab tab, FragmentTransaction ft)
{
}
/// <summary>
/// Adds the fragment when the tab was selected
/// </summary>
/// <param name="tab"></param>
/// <param name="ft"></param>
public void OnTabSelected(ActionBar.Tab tab, FragmentTransaction ft)
{
Fragment fragment = null;
if (tab.Text == "Users")
{
fragment = Global.UserFragment;
}
else
{
fragment = Global.ChatWindows.FirstOrDefault(chat => chat.User.Name == tab.Text);
tab.SetIcon(Resource.Drawable.message);
}
Global.CurrentFragment = fragment;
FragmentManager fm = Global.QActivity.FragmentManager;
fm.BeginTransaction().Add(Resource.Id.Frame_container, fragment, tab.Text).Commit();
}
/// <summary>
/// Removes the fragment when the tab was deselected
/// </summary>
/// <param name="tab"></param>
/// <param name="ft"></param>
public void OnTabUnselected(ActionBar.Tab tab, FragmentTransaction ft)
{
Fragment fragment = null;
if (tab.Text == "Users")
{
fragment = Global.UserFragment;
}
else
{
fragment = Global.ChatWindows.FirstOrDefault(chat => chat.User.Name == tab.Text);
tab.SetIcon(Resource.Drawable.QChatOffline);
}
FragmentManager fm = Global.QActivity.FragmentManager;
fm.BeginTransaction().Remove(fragment).Commit();
}
}
개인 무효 StartChat (문자열 이름, 부울 selectedFromList) { 이 { 사용자 사용자 = GetUserByName (사용자 이름)를 시도; ChatFragment chatFragment = Global.ChatWindows.Find (chatWindow => chatWindow.User.Name == user.Name); var ft = this.activity.FragmentManager.BeginTransaction(); if (chatFragment == null) { chatFragment = new ChatFragment(); chatFragment.User = user; chatFragment.CurrentUser = Global.Host.Username; 안드로이드에서
var chatTab = this.activity.ActionBar.NewTab();
chatFragment.TabListener = new TabListener<ChatFragment>(chatFragment);
chatTab.SetTabListener(chatFragment.TabListener);
chatTab.SetIcon(Resource.Drawable.message);
chatTab.SetText(userName);
// Add the new tab to the action bar
this.activity.ActionBar.AddTab(chatTab);
ft.Add(Resource.Id.Frame_container, chatFragment, user.Name);
Global.ChatWindows.Add(chatFragment);
this.activity.ActionBar.SelectTab(chatTab);
Global.CurrentFragment = chatFragment;
ft.Commit();
}
else
{
int index = Global.ChatWindows.FindIndex(chat => chat.User.Name == chatFragment.User.Name);
ActionBar.Tab tab = this.activity.ActionBar.GetTabAt(index + 1);
tab.SetIcon(Resource.Drawable.message);
if (selectedFromList)
{
ft.Remove(chatFragment);
ft.Commit();
Global.CurrentFragment = chatFragment;
try
{
var fragmentTransaction = this.activity.FragmentManager.BeginTransaction();
this.activity.ActionBar.SelectTab(tab);
fragmentTransaction.Commit();
}
catch (Exception ex)
{
}
}
else
{
ft.Remove(chatFragment);
ft.Add(Resource.Id.Frame_container, chatFragment, user.Name);
ft.Commit();
}
}
chatFragment.ChatHistory.Add(new ChatHistory()
{
FirstPartColor = Android.Graphics.Color.Red,
FirstPartMessage = DateTime.Now.ToString("HH:mm:ss"),
SecondPartMessage = String.Format(" {0} is {1}.", user.Name, m_chatWindowManager.GetStatusText(user.Status).Replace("%@[email protected]%", "\r\n" + "\r\n")),
SecondPartColor = Android.Graphics.Color.Red
});
Global.ChatStarted = true;
}
catch (Exception exception)
{
((QChatActivity)this.activity).ShowMessage("Failed StartChat(string userName) for user " + userName + " Exception : " + exception.Message + exception.StackTrace);
}
}
답장을 보내 주셔서 감사합니다. 메시지 전송 및 수신을 관리 할 수있는 활동은 하나뿐입니다. 하나는 사용자 목록을 보여주는 클래스이고 다른 하나는 채팅을위한 클래스입니다. 사용자 목록 조각에서 나는 많은 채팅 조각을 여는 중입니다. 새 프레임에서 런타임을 열고 새 프레임에서 스왑 핑하는 코드 스 니펫을 제공 할 수 있습니까? 덕분에 –
나는 작업 표시 줄 탭과 조각을 사용하여이 작업을 수행했지만 이제는 이전 상태를 잃어 버리지 않고 탭간에 전환하는 방법이 있습니다. 나는 tablistner를 사용했으나 prevoius 상태를 보존 할 수는 없었다. –