Страница 1 из 1

Вызов активити по клику по Tableraw

Добавлено: 19 авг 2012, 22:58
SLV
В гланой активити есть три TableLayout c TableRow01 .... TableRow57

При клику по TableRowXX

Код: Выделить всё

TableRow01.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				Intent intt = new Intent(html_view, html_view.class);
				startActivity(intt);
			}
		});
должен открываться html файл file01 в WebView01 в активити html_view.

Код: Выделить всё

public class html_view extends Activity {
	 private WebView html_view;
		@Override

	public void onCreate(Bundle icicle) {
			super.onCreate(icicle);
		setContentView(R.layout.html_view);
		html_view = (WebView) findViewById(R.id.WebView01);
		html_view.loadUrl("file:///android_asset/file01.html");
	}
}
Все работает, но ни как не могу сообразить как закодить обработку вызова файлов так чтобы не писать 57 раз одно и тоже.

Создал массив строк с названиями файлов file для loadUrl, а как сформироваит вызов TableRow.setOnClickListener(new View.OnClickListener() для i 1...57 сообразить не могу, туплю с алгоритмом.
Подскажите, пожалуйста, как сделать, а лучше пример кода.

Re: Вызов активити по клику по Tableraw

Добавлено: 20 авг 2012, 09:46
KamiSempai
Эм.... А не проще использовать ListView?

Re: Вызов активити по клику по Tableraw

Добавлено: 20 авг 2012, 23:00
SLV
Может и проще для вызова по клику на элемент списка. Но т.к. у меня на экран должна выводиться таблица со стройными столбцами, то сделать это с помощью списка с возможностью выравнивания текста в столбцах таблицы при разных разрешениях экрана - сложно. У меня не выходит.
Поэтому я решил использовать Tableview.

Просьба помочь в решени моей задачи с выбором по клику на строку таблицы.

Re: Вызов активити по клику по Tableraw

Добавлено: 22 авг 2012, 13:57
math64
1. Если использовать ListView - в разметке ячейки ширину столбцов указывать 0 и каждому столбцу давать вес в соответствии, какую долю ширины ячейки Вы хотите ему отдать.
2. При использовании TableLayout.
В каждом TableRow прописать в тег url открываемого файла.
В методе onClick он прописывается в bundle.
В методе onCreate новой активити он извлекается из bundle и передаётся в html_view.

Re: Вызов активити по клику по Tablerow

Добавлено: 22 авг 2012, 18:40
SLV
math64
Спасибо за ответ. Думаю мне больше подойдет 2-й вариант с TableLayout (TableRow)

Но т.к. кодить на java я только учусь, можно немного по-подробнее:
я так понял, что в тег каждого TableRow я должен прописать URL что-то типа file:///android_asset/filexx.html или @string/filexx. Но вот как прописать вызов по клику на TableRow?

Если не сложно, помогите с кодом для onClick и onCreate чтобы передать URL в html_view.
Буду очень признателен за пример с пояснением сути.

Re: Вызов активити по клику по Tableraw

Добавлено: 23 авг 2012, 08:05
math64
URL указываете в разметке - если Вам это подгодит. Но можно сделать это и в коде.

Код: Выделить всё

TableRow[] rows = new TableRow[] { (TableRow)findViewById(R.id.row1), (TableRow)findViewById(R.id.row2), ... };
String[] urls = new String[] { "file:///android_asset/file01.html", "file:///android_asset/file02.html", ... };
View.OnClickListener onRowClick = new View.OnClickListener() {
     public void onClick(View v) {
       Object tag = v.getTag();
       Bundle b = new Bundle();
       b.putString("url", tag.toString());
       Intent intt = new Intent(this, html_view.class);
       startActivity(intt, bundle);
     }
};
for(int i = 0; i < rows.length; i++) {
  TableRow row = rows[i];
  row.setOnClikListener(onRowClick);
  row.setTag(urls[i]);
}

Re: Вызов активити по клику по Tableraw

Добавлено: 23 авг 2012, 17:16
SLV
math64
Не выходит (:

В главной (вызывающей) активити с таблицей (файл classes.java) так:

Код: Выделить всё

package com.samples.tables;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TableRow;
	public class classes extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.classes);

		TableRow[] rows = new TableRow[] {
				(TableRow) findViewById(R.id.TableRow1),
				(TableRow) findViewById(R.id.TableRow2),
				...... };

		String[] urls = new String[] { "file:///android_asset/f01.html",
				"file:///android_asset/f02.html",
				........ };

    View.OnClickListener onRowClick = new View.OnClickListener() {

         public void onClick(View v) {
           Object tag = v.getTag();
		Bundle b = new Bundle();
           b.putString("url", tag.toString());
		Intent intt = new Intent(this, html_view.class);
		startActivity(intt, bundle);
			}
		};
	
    for(int i = 0; i < rows.length; i++) {
      TableRow row = rows[i];
      row.setOnClickListener(onRowClick);
      row.setTag(urls[i]);
    } 
	}
}
Ругается на

Код: Выделить всё

Intent intt = new Intent(this, html_view.class);
The constructor Intent(new View.OnClickListener(){}, Class<html_view>) is undefined

Код: Выделить всё

startActivity(intt, bundle);
bundle cannot be resolved to a variable

Хотя Class<html_view> создан (есть файл html_view.java), bundle b тоже есть. Где не так?

И еще, что должно быть в файле html_view.java c webview01, чтобы туда подставился нужный URL из массива urls?

Re: Вызов активити по клику по Tableraw

Добавлено: 23 авг 2012, 17:34
rezak90
Может так:
Intent intt = new Intent(classes.this, html_view.class);
З.Ы. имена классов пишутся с большой буквы!

Re: Вызов активити по клику по Tableraw

Добавлено: 23 авг 2012, 18:10
SLV
rezak90 писал(а):Может так:
Intent intt = new Intent(classes.this, html_view.class);
Помогло, ошибки нет.
Во втором случае помогло так:

Код: Выделить всё

intt.putExtras(b);
startActivity(intt);
в файл html_view.java прописал так:

Код: Выделить всё

Bundle b = getIntent().getExtras();
		String value = b.getString("url");

	 	html_view = (WebView) findViewById(R.id.WebView01);
		html_view.loadUrl(value);
Работает :)

Re: Вызов активити по клику по Tableraw

Добавлено: 24 авг 2012, 07:44
math64
Писал прямо на экране - не пробовал компилировать, оттуда и ошибки. Что вместо bundle нужно писать b можно бы и так догадаться.
В вот первую ошибку исправить новичку без подсказки трудно - тем более, что компилятор ерунду в сообщении об ошибках пишет.
У вложенных и анонимных классов есть несколько указателей this, и необходимо уточнять, какой имеется ввиду.
Вместо анонимного класса слушателя можно в активити реализовать интерфейс слушателя, но часто нужно иметь разные слушатели на разные виджеты. А можно вынести слушатель в отдельный файл.
Кстати, можно обойтись без bundle, просто putExtra и getStringExtra() (урок 28)