Это может быть очень новый вопрос, но я не понимаю, как создать одно простое 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 окно чата, которое можно переключать с одного на другое соответственно. ?
Буду признателен за любой пример кода, ссылку или указатель, которые помогут мне решить эту проблему!