2012-08-10 5 views
1

누구나 내게 아래의 문제에 대한 해결책을 말해 줄 수 있습니까? 파편을 사용하여 여러 채팅 창을 열고 싶은 간단한 채팅 응용 프로그램을 만들었습니다. 이 작업을 수행했지만 이제는 문제가 채팅 조각을 분리 할 수 ​​없으므로 모두 서로 겹칩니다. 버튼을 최소화하고 최대화하여 이러한 조각을 개별적으로 만들 수 있도록 솔루션을 제안하십시오. 코드 스 니펫 (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); 
     } 
    } 

답변

0

는 대신에 당신이 별도의 창에서 채팅을위한 활동과 같은 경고 상자를 만들 수 있습니다 최소화하거나 화면을 최대화에 대한 지원이 없습니다.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center" 
    android:background="@android:color/white" 
    android:orientation="vertical" android:padding="20dp"> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:orientation="vertical" 
     android:padding="5dp" > 

     <TextView 
      android:id="@+id/welcomeToIM" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_above="@+id/scrollView1" 
      android:textColor="#000000" 
      android:textSize="14dp" /> 
    </LinearLayout> 

    <ScrollView 
     android:id="@+id/scrollView1" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_above="@+id/edittext1" 
     android:layout_centerHorizontal="true" 
     android:layout_marginBottom="5dp" 
     android:layout_marginTop="25dp" 
     android:background="@android:drawable/editbox_background_normal" > 

     <LinearLayout 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:gravity="center" 
      android:orientation="vertical" 
      android:padding="5dp" > 

      <TextView 
       android:id="@+id/textMsg" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:textColor="#000000" 
       android:textSize="14dp" /> 
     </LinearLayout> 
    </ScrollView> 

    <Button 
     android:id="@+id/btn2" 
     android:layout_width="150dp" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentLeft="true" 
     android:background="@android:drawable/editbox_background_normal" 
     android:text="Contacts" 
     android:textColor="#000000" /> 

    <Button 
     android:id="@+id/btn1" 
     android:layout_width="150dp" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentRight="true" 
     android:background="@android:drawable/editbox_background_normal" 
     android:text="Send" 
     android:textColor="#000000" /> 

    <EditText 
     android:id="@+id/edittext1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/btn2" 
     android:layout_alignParentLeft="true" 
     android:background="@android:drawable/editbox_background_normal" 
     android:ems="10" 
     android:hint="Type a Message" 
     android:maxLines="5" 
     android:textColor="#000000" > 

     <requestFocus /> 
    </EditText> 

</RelativeLayout> 
+0

답장을 보내 주셔서 감사합니다. 메시지 전송 및 수신을 관리 할 수있는 활동은 하나뿐입니다. 하나는 사용자 목록을 보여주는 클래스이고 다른 하나는 채팅을위한 클래스입니다. 사용자 목록 조각에서 나는 많은 채팅 조각을 여는 중입니다. 새 프레임에서 런타임을 열고 새 프레임에서 스왑 핑하는 코드 스 니펫을 제공 할 수 있습니까? 덕분에 –

+0

나는 작업 표시 줄 탭과 조각을 사용하여이 작업을 수행했지만 이제는 이전 상태를 잃어 버리지 않고 탭간에 전환하는 방법이 있습니다. 나는 tablistner를 사용했으나 prevoius 상태를 보존 할 수는 없었다. –

관련 문제