看板 Knuckles_note
作者 標題 [AndroidStudio] 點擊列表後進入新的 activity 頁面
時間 2015-12-02 Wed. 23:54:39
建立好 ListView 後
再來要讓 ListView 上的每個 Row 被點擊後
會進入文章閱讀的頁面
加上新的 Activity
先加上新頁面的label文字設定
修改 /res/values/strings.xml
在<resources>和</resources>之間加上
<string name="activity_text">閱讀文章</string>
在 res/layout 開一個新的 activity
![[圖]](http://i.imgur.com/kTqlEeU.png)
名稱輸入 activity_text.xml
![[圖]](http://i.imgur.com/OSpYpws.png)
在 <LinearLayout …> 與 </LinearLayout> 中間加進一個 <TextView>
先用來顯示文章的網址
<TextView
android:id="@+id/url_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginTop="20dp"
android:text="文章的網址" />
android:id="@+id/url_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginTop="20dp"
android:text="文章的網址" />
在 java 下新增一個閱讀文章頁的類別
![[圖]](http://i.imgur.com/Hgz8aWF.png)
名稱輸入 TextActivity
![[圖]](http://i.imgur.com/X1mWkYY.png)
修改 TextActivity.java
將類別加上繼承自 AppCompatActivity
加上一個成員變數 urlTextView 和成員函式 onCreate()
public class TextActivity extends AppCompatActivity {
TextView urlTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 設定這個頁面XML的layout名稱
setContentView(R.layout.activity_text);
// 設定要顯示回上一頁的按鈕
android.support.v7.app.ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
// 取得 Intent 附帶的資料,改成文章網址存為 url
Bundle args = this.getIntent().getExtras();
String url = "http://disp.cc/b/" + args.getString("bi") + "-" + args.getString("ti");
// 取得XML中的TextView,設定文字為 url
urlTextView = (TextView) findViewById(R.id.url_textview);
urlTextView.setText(url);
}
}
TextView urlTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 設定這個頁面XML的layout名稱
setContentView(R.layout.activity_text);
// 設定要顯示回上一頁的按鈕
android.support.v7.app.ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
// 取得 Intent 附帶的資料,改成文章網址存為 url
Bundle args = this.getIntent().getExtras();
String url = "http://disp.cc/b/" + args.getString("bi") + "-" + args.getString("ti");
// 取得XML中的TextView,設定文字為 url
urlTextView = (TextView) findViewById(R.id.url_textview);
urlTextView.setText(url);
}
}
監聽 ListView 的點擊動作
修改 MainActivity.java
在 onCreate() 裡加上
mListView.setOnItemClickListener(this);
點一下畫紅線的this,點左邊出現的紅燈泡或按Alt+Enter,選「Make 'MainActivity' implement 'android.widget.AdapterView.OnItemClickListener'」
![[圖]](http://i.imgur.com/gXq7Z7e.png)
這樣會自動在 public class MainActivity extends AppCompatActivity 後面加上
implements AdapterView.OnItemClickListener
也就是在類別 MainActivity 加上 interface AdapterView.OnItemClickListener
接著會詢問是否加上成員函式 onItemClick,點OK
![[圖]](http://i.imgur.com/j7q1Xmc.png)
在 onItemClick 裡加上點擊後要做的事情,改成像這樣
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//從成員mainAdapter中用getItem取出第position項的資料,存成jsonObject
JSONObject jsonObject = (JSONObject) parent.getAdapter().getItem(position);
//取出我們要的兩個資料 bi 和 ti
String bi = jsonObject.optString("bi","");
String ti = jsonObject.optString("ti","");
// 建立一個 Intent 用來表示要從現在這頁跳到文章閱讀頁 TextActivity
Intent textIntent = new Intent(this, TextActivity.class);
// 將要傳遞的資料放進 Intent
textIntent.putExtra("bi", bi);
textIntent.putExtra("ti", ti);
// 使用準備好的 Intent 來開啟新的頁面
startActivity(textIntent);
}
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//從成員mainAdapter中用getItem取出第position項的資料,存成jsonObject
JSONObject jsonObject = (JSONObject) parent.getAdapter().getItem(position);
//取出我們要的兩個資料 bi 和 ti
String bi = jsonObject.optString("bi","");
String ti = jsonObject.optString("ti","");
// 建立一個 Intent 用來表示要從現在這頁跳到文章閱讀頁 TextActivity
Intent textIntent = new Intent(this, TextActivity.class);
// 將要傳遞的資料放進 Intent
textIntent.putExtra("bi", bi);
textIntent.putExtra("ti", ti);
// 使用準備好的 Intent 來開啟新的頁面
startActivity(textIntent);
}
這樣就可以監聽 ListView 的點擊事件
當有點擊時會執行 onItemClick()
跳頁時要建立一個 Intent,Intent 是"意圖"的意思
使用 new Intent(this, TextActivity.class) 代表要從現在這個類別跳到 TextActivity 這個類別
並將想要帶過去的資料使用 puExtra 包進去
接著使用 Intent 來執行 startActivity
即可跳至新的 Activity 並將資料帶過去
要使用回上層按鈕的話,要在 manifests 加上一些頁面的設定
修改 AndroidManifest.xml
在 MainActivity 的屬性設定加上 android:launchMode="singleTop"
像這樣
<activity
android:name=".MainActivity"
android:launchMode="singleTop">
android:name=".MainActivity"
android:launchMode="singleTop">
使用 android:launchMode="singleTop"
可以在進入新頁面時保留ListView滑動的位置
以免返回上層時又回到列表的最上方
在 </activity> 的下一行再加上閱讀文章頁的設定
<activity
android:name=".TextActivity"
android:label="@string/activity_text"
android:parentActivityName=".MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity"/>
</activity>
android:name=".TextActivity"
android:label="@string/activity_text"
android:parentActivityName=".MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity"/>
</activity>
執行看看,在熱門文章上點擊某一列
會開啟新頁面並顯示該篇文章的網址
![[圖]](http://i.imgur.com/jCfzHMi.png)
點左上角的 ← 可回到熱門文章列表
參考:
Android Developer - 使用 [返回] 及 [上一層] 導覽
http://www.raywenderlich.com/78578/android-tutorial-for-beginners-part-3
接著下一篇將網頁內容用 WebView 顯示出來
[AndroidStudio] 加入 WebView 瀏覽網頁
錯誤解決記錄
在列表點擊第一篇文章時,開啟的卻是第二篇文章
→ 在 onItemClick 裡,要用 parent.getAdapter().getItem(position) 來取得第 position 項資料
不可以使用成員變數的 mAdapter.getItem(position) 來取
不然若使用了 mAdapter.addHeaderView() 後 position 會不正確
參考這篇
--
※ 作者: Knuckles 時間: 2015-12-02 23:54:39
※ 編輯: Knuckles 時間: 2016-02-18 10:27:01
※ 看板: KnucklesNote 文章推薦值: 0 目前人氣: 0 累積人氣: 2008
2樓 時間: 2016-01-11 21:58:50 (台灣)
→
01-11 21:58 TW
···
上面要有 import android.support.v7.app.AppCompatActivity; 如果有設定 Auto Import 的話,應該會自動加上去才對
3樓 時間: 2016-01-12 00:04:34 (台灣)
→
01-12 00:04 TW
···
那你一開始的 MainActivity 不是 extends AppCompatActivity 嗎? 不然就改成跟 MainActivity extends 的東西一樣看看 或是看一下 build.gradle 的 dependencies 裡有沒有 compile 'com.android.support:appcompat-v7:23.1.1'
4樓 時間: 2016-01-12 22:18:58 (台灣)
→
01-12 22:18 TW
···
那應該是你的SDK Manager一開始是裝API 21吧,我的是裝API 16和API 23
5樓 時間: 2016-01-12 23:00:49 (台灣)
→
01-12 23:00 TW
···
你的 MainActivity extends 接什麼呢? SDK Manager 有裝 API 23 了嗎?
回列表(←)
分享