Как сделать окно чата, как Skype в Android в базовом приложении с вкладками - PullRequest
1 голос
/ 15 марта 2012

Это может быть очень новый вопрос, но я не понимаю, как создать одно простое multi user chat приложение, имеющее несколько окон чата, отдельных для каждого пользователя. Я создаю одно Tabbed приложение на основе Это , имеющее несколько Tabs (5). На главной вкладке есть google map с выводами моих ближайших (согласно настройкам) вентиляторов и три ImageButtons вверху кнопки список показывает мне MapPins в виде списка. Messages вкладка есть список из всех фанатов это кому я могу Chat.

Что мне нужно, так это когда я нажимаю на любой элемент списка поклонников, открывается одна ChatWindow (отдельно для каждого пользователя, которую можно переключать с одного на другого) на той же вкладке, и имея три кнопки сверху список для возврата к списку поклонников, кнопка удаления для удаления истории чата и кнопка закрытия для временного закрытия текущего окна чата, так же, как это новое окно чата открывается при каждом щелчке элемента списка поклонников, если окно чата поклонника еще не открыто или я собираюсь пообщаться с новым поклонником. Я следую за блогом Марка Рейхельта , чтобы переключаться между этими несколькими ChatWindows представлениями, как это делает домашний экран. Спасибо @Marc Reichelt за такой замечательный блог.

как мне построить макет с тремя кнопками сверху, фиксированными и несколькими окнами чата под ним, которые можно переключать ... ?

Я строю один Test-ChatWindow, следуя Марк

my code is ->

public class MultipleChatWindows extends Activity implements OnClickListener {

 /** Class that extends ViewGroup */
 RealViewSwitcher realViewSwitcher;

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

    // create the view switcher
    realViewSwitcher = new RealViewSwitcher(getApplicationContext());

    final int[] backgroundColors = { Color.RED, Color.BLUE, Color.CYAN,
            Color.GREEN, Color.YELLOW };
    for (int i = 0; i < 5; i++) {
        TextView dateTime = new TextView(getApplicationContext());
        dateTime.setTag("time" + i);
        dateTime.setTextSize(15);
        dateTime.setHint("Date & Time");
        //dateTime.setTextColor(Color.YELLOW);
        dateTime.setTextColor(Color.BLACK);
        dateTime.setGravity(Gravity.RIGHT);
        dateTime.setBackgroundColor(backgroundColors[i]);

        ScrollView scVw = new ScrollView(this);
        scVw.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 1));
        scVw.setTag("chat_scVw" + i);
        // scVw.setLayoutParams(new LayoutParams(320, 300));// 320,380
         scVw.setBackgroundColor(Color.TRANSPARENT);

        TableLayout table = new TableLayout(this);
        table.setStretchAllColumns(true);
        table.setShrinkAllColumns(true);
        table.setTag("chat_table" + i);
        //table.setLayoutParams(new LayoutParams(320, LayoutParams.MATCH_PARENT));
        table.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 1));
        //table.setWeightSum(1);
        table.setSelected(true);
        table.setScrollBarStyle(ScrollView.SCROLLBARS_INSIDE_INSET);
        //table.setBackgroundColor(Color.GRAY);

        TableRow rowTitle = new TableRow(this);
        rowTitle.setGravity(Gravity.CENTER_HORIZONTAL);

        TableRow rowConditions = new TableRow(this);
        rowConditions.setGravity(Gravity.CENTER);

        TextView title = new TextView(this);//
        title.setText("ManU CHAT Window" + i);

        title.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18);
        title.setGravity(Gravity.CENTER);
        title.setTypeface(Typeface.SERIF, Typeface.BOLD);

        /* If i add the table on scroll view then when i add one new row in this table view by clicking 
         * on send button & try to scroll on to next chat window then it will not give me the touch listener 
         * which is call when i touch on the scroll view. that`s why i directly add table on to main view 
         * behalf of adding this scroll view but it create one problem that is when the given size of the
         * table is filed by the rows then it will not scrolled... How do enable scrolling on it???   */
         scVw.addView(table);
        //table.addView(scVw);

        LinearLayout main = new LinearLayout(this);
        main.setOrientation(LinearLayout.VERTICAL);
        main.setBackgroundColor(backgroundColors[i]);
        main.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        main.setPadding(5, 5, 5, 5);

        LinearLayout chatChild = new LinearLayout(this);
        chatChild.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
        chatChild.setBackgroundColor(Color.LTGRAY);
        //chatChild.setWeightSum(1);

        EditText chatMessage = new EditText(this);
        chatMessage.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 1));
        chatMessage.setTag("chat_msg_text" + i);
        chatMessage.setSingleLine();
        chatMessage.setHint("Type your Message");

        Button sendMessage = new Button(this);
        sendMessage.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        sendMessage.setId(i);
        sendMessage.setTag("chat_send_btn" + i);
        sendMessage.setText("Send");

        sendMessage.setOnClickListener(this);

        chatChild.addView(chatMessage);
        chatChild.addView(sendMessage);

        main.addView(dateTime);
        main.addView(scVw);
        //main.addView(table);
        main.addView(chatChild);

        realViewSwitcher.addView(main);

    }

    // set as content view
    setContentView(realViewSwitcher);

    // OPTIONAL: listen for screen changes
    realViewSwitcher.setOnScreenSwitchListener(onScreenSwitchListener);

 }

 private final RealViewSwitcher.OnScreenSwitchListener onScreenSwitchListener = new RealViewSwitcher.OnScreenSwitchListener() {
    @Override
    public void onScreenSwitched(int screen) {
        // this method is executed if a screen has been activated, i.e. the
        // screen is completely visible
        // and the animation has stopped (might be useful for removing /
        // adding new views)
        Log.d("RealViewSwitcher", "switched to screen:" + screen);
    }
 };

 @Override
 public void onClick(View v) {
    // TODO Auto-generated method stub
    sendText(v.getId());
    Log.i("SndBtn_ID & TAG>", "ID:" + v.getId() + ", TAG:" + v.getTag());
 }

 private void sendText(int index) {
    EditText textVw = (EditText) realViewSwitcher.getChildAt(index).findViewWithTag("chat_msg_text" + index);
    String text = textVw.getText().toString();

    Log.i("MSG>>>", ":" + text);

    if (!text.equals("")) {

        TableLayout tbl = (TableLayout) realViewSwitcher.getChildAt(index).findViewWithTag("chat_table" + index);

        // scVw=(ScrollView)realViewSwitcher.getChildAt(index).findViewWithTag("chat_scVw"+index);
        TableRow rowMsg = new TableRow(this);

        TableRow.LayoutParams params1 = new TableRow.LayoutParams();
        // params1.span = 2;
        rowMsg.setLayoutParams(params1);

        /* layout that hold one complete row(i.e.,image, message & line separator). */
        LinearLayout rowChild = new LinearLayout(this);
        rowChild.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
        rowChild.setOrientation(LinearLayout.VERTICAL);
        //rowChild.setBackgroundColor(Color.GRAY);

        /* layout that hold image & message. */
        LinearLayout rowChildData = new LinearLayout(this);
        rowChildData.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
        rowChildData.setOrientation(LinearLayout.HORIZONTAL);
        rowChildData.setBackgroundColor(Color.GRAY);

        /* layout that show the separator line. */
        LinearLayout rowChildSeparator = new LinearLayout(this);
        rowChildSeparator.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,1)); 
        rowChildSeparator.setOrientation(LinearLayout.VERTICAL);
        //rowChildSeparator.setBackgroundColor(Color.LTGRAY);

        /* Image icon showing that this msg is of. */
        ImageView nxtTo = new ImageView(this);
        LinearLayout.LayoutParams nxtParam=new LinearLayout.LayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        nxtParam.topMargin=6;
        nxtParam.gravity=Gravity.TOP;
        nxtTo.setLayoutParams(nxtParam);//(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

        nxtTo.setImageDrawable(this.getResources().getDrawable(R.drawable.red_arrow));

        TextView msg1 = new TextView(this);
        msg1.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 1));
        msg1.setText(text);
        msg1.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18);
        msg1.setGravity(Gravity.LEFT);
        msg1.setTypeface(Typeface.SERIF, Typeface.BOLD);

        TableRow.LayoutParams paramsMsg = new TableRow.LayoutParams();
        paramsMsg.span = 1;
        paramsMsg.weight = 1;

        TableRow.LayoutParams paramsImg = new TableRow.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        paramsImg.gravity = Gravity.LEFT;

        ImageView img1 = new ImageView(this);
        img1.setLayoutParams(new LayoutParams(30, 30));
        img1.setImageDrawable(this.getResources().getDrawable(R.drawable.icon));

        rowChildData.addView(img1);
        rowChildData.addView(nxtTo);
        rowChildData.addView(msg1);

        rowChild.addView(rowChildData);
        rowChild.addView(rowChildSeparator);

        rowMsg.addView(rowChild, paramsMsg);

        tbl.addView(rowMsg);

    }

    Toast.makeText(this, text, Toast.LENGTH_LONG).show();
    textVw.setText(null);
  }
 }

я прошел через ListView в Режим расшифровки & как обновить пользовательский интерфейс из фоновых служб . Я работаю над созданием простого многопользовательского приложения чата, имеющего отдельное окно чата для каждого пользователя, например gTalk (google talk), приложение по умолчанию для Android.

когда я использую представление списка, в этом случае я не понимаю, как обновить адаптер из фоновой службы или когда я отправляю новое сообщение (как динамически создавать различные адаптеры и обновлять их). Теперь я использую TableView и динамически добавляю в него одну строку, когда нажимаю кнопку отправки или фон Service sendBroadcast .

я запутался в том, что лучше использовать ListView или TableView ...?

Наконец, я пытаюсь создать окно чата с тремя кнопками в верхнем и нескольких окнах чата, например skype`s окно чата, которое можно переключать с одного на другое соответственно. ? Буду признателен за любой пример кода, ссылку или указатель, которые помогут мне решить эту проблему!

1 Ответ

2 голосов
/ 15 марта 2012

UI

Я бы создал пользовательский интерфейс в XML.

  • Определите мои ListView в chat.xml , помните, что идентификатор вашего ListView должен быть @android:id/list.
  • Создайте chat_row.xml с двумя различными макетами, один для исходящих сообщений и один для входящих.

Вам понадобится 9-патч для фона текста (фактически буксировка, один для входящего и один для исходящего).

код

  • Наследовать от ListActivity и установить chat.xml как представление содержимого .
  • Храните сообщения чата в базе данных Sqlite .
  • Создайте пользовательский CursorAdapter и установите его в качестве адаптера списка.
  • В функции bindView для вашего CursorAdapter скрыть / показать правильный макет из вашего chat_row.xml и установить все значения (значения, которые вы получите из базы данных).

Ссылки

Пользовательские CursorAdaptors - http://thinkandroid.wordpress.com/2010/01/11/custom-cursoradapters/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...