顯示廣告
隱藏 ✕
看板 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
※ 看板: KnucklesNote 文章推薦值: 0 目前人氣: 0 累積人氣: 2008 
分享網址: 複製 已複製
1樓 時間: 2016-01-11 21:46:07 (台灣)
     (編輯過) TW
···
您好, 按照此教學去做, 在AndroidManifest.xml中的android:name=".TextActivity", ".TextActivity"永遠是紅底線, 顯示錯誤訊息is not assignable, 未指派
2樓 時間: 2016-01-11 21:58:50 (台灣)
  01-11 21:58 TW
···
而TextActivity.java的內容中, AppCompatActivity為紅字, 顯示錯誤訊息為Cannot resolve symbol 'AppCompatActivity'; 被紅燈提示Create class 'AppCompatActivity'. 是不是沒有import含有AppCompatActivity的內容?
上面要有 import android.support.v7.app.AppCompatActivity;
如果有設定 Auto Import 的話,應該會自動加上去才對
3樓 時間: 2016-01-12 00:04:34 (台灣)
  01-12 00:04 TW
···
我已經確認有設定Auto Import; 我將教學中TextActivity中的內容複製貼上, 只有自動import 'android.os.Bundle'及'android.widget.TextView'這兩個; 要是我手動複製貼上'import android.support.v7.app.AppCompatActivity;', 則整句描述會被自動加上灰色底線, 顯示'Unused import statement'訊息, 請問這代表'android.support.v7.app.AppCompatActivity;'是失效的? 那麼請問接下來應該要讓它生效或是import其他能用的項目?
那你一開始的 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
···
1. 將Gradle Scripts\build.gradle(Module:app)其中的
   compileSdkVersion 23(由21改成23)
   targetSdkVersion 23(由21改成23)
2. 承上, compile內改為以下敘述
   compile 'com.android.support:appcompat-v7:23.1.1'
如此一來, 原本在MainActivity.java及TextActivity.java裡一堆的錯誤敘述就沒了, 而執行APP時, 文章列表尚未出現即強制終止.
那應該是你的SDK Manager一開始是裝API 21吧,我的是裝API 16和API 23
5樓 時間: 2016-01-12 23:00:49 (台灣)
  01-12 23:00 TW
···
檢視logcat內的紀錄, 看到這一行FATAL EXCEPTION: main java.lang.RuntimeException: Unable to start activity ComponentInfo{com.disp_tech.dispbbs_diy/com.disp_tech.dispbbs_diy.MainActivity}: java.lang.NullPointerException, 後面還有許多錯誤訊息
你的 MainActivity extends 接什麼呢?
SDK Manager 有裝 API 23 了嗎?
6樓 時間: 2016-01-12 23:06:39 (台灣)
  01-12 23:06 TW
···
檢視TextActivity.java中, 
// 設定要顯示回上一頁的按鈕
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
這行敘述有跳出toast, 說may produce 'java.lang.NullPointerException', 我想可能是這裏出了問題, 卻還不知道怎麼修改, 我再找找看有沒有解決方法, 多謝您的指導.
我覺得那不是問題所在,應該是你沒有裝 API 23
7樓 時間: 2016-01-12 23:38:17 (台灣)
  01-12 23:38 TW
···
MainActivity.java中, 是這樣接的public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener, 
SDK Manager的API 16&23已經全部都安裝了, 執行app的結果還是一樣強制終止, 仍然是java.lang.NullPointerException的問題.
8樓 時間: 2016-01-12 23:46:37 (台灣)
  01-12 23:46 TW
···
[圖]
[圖]
是的, API 16及23底下的所有內容都已經安裝了;
[圖]
還有已經安裝的SDK Tools, 若有疏漏請指教, 謝謝您.
恩 那就奇怪了 Google了一下看到 這篇 
用 File->Invalidate Caches/Restart 試試看吧,還是不行的話我就不知道了 XD
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇