看板 Knuckles_note
作者 Knuckles (站長 那克斯)
標題 [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


名稱輸入 activity_text.xml


在 <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="文章的網址" />

在 java 下新增一個閱讀文章頁的類別


名稱輸入 TextActivity


修改 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);
    }
}


監聽 ListView 的點擊動作

修改 MainActivity.java

在 onCreate() 裡加上
        mListView.setOnItemClickListener(this);
點一下畫紅線的this,點左邊出現的紅燈泡或按Alt+Enter,
選「Make 'MainActivity' implement 'android.widget.AdapterView.OnItemClickListener'」


這樣會自動在 public class MainActivity extends AppCompatActivity 後面加上
implements AdapterView.OnItemClickListener
也就是在類別 MainActivity 加上 interface AdapterView.OnItemClickListener

接著會詢問是否加上成員函式 onItemClick,點OK


在 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);
    }

這樣就可以監聽 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: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 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