2012-02-01 112 views
4

請不要評價我,我對Android開發非常新......我想用viewPager做一個應用程序......我有三個不同的佈局頁面......但我無法確定瞭解如何處理viewPager第二頁上的按鈕。我發現這個問題「How to write button onClick method in viewpager?」,並設置我的代碼是這樣的:viewPager按鈕活動?

ViewPagerAdapter:

@Override 
public Object instantiateItem(View pager, int position) 
{ 
    View v = new View(pager.getContext()); 
    LayoutInflater inflater = 
      (LayoutInflater) pager.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    int resId = 0; 
    switch (position) { 
    case 0:   
     resId = R.layout.deneme;    
     break; 
    case 1: 
     resId = R.layout.deneme2;   
     break; 
    case 2: 
     resId = R.layout.deneme3; 
     break; 
    } 

    v = inflater.inflate(resId, null); 
    ((ViewPager) pager).addView(v, 0); 

    return v; 
    } 

在這裏,我得到錯誤: 「的方法findViewById(INT)是不確定的新類型View.OnClickListener(){}」上線

LinearLayout l = (LinearLayout) findViewById(R.id.layout2); 

和 「所述的方法,getResources()是未定義用於在線

類型新View.OnClickListener(){}」
l.setBackgroundDrawable(getResources().getDrawable(R.drawable.background)); 

主營:

public class ViewPagerProjectActivity extends Activity { 

Button btn; 
View deneme2lout; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    ViewPagerAdapter adapter = new ViewPagerAdapter(this); 
    ViewPager pager = (ViewPager)findViewById(R.id.viewpager); 
    pager.setAdapter(adapter); 
    pager.setCurrentItem(0); 


    LayoutInflater getView = getLayoutInflater(); 
    deneme2lout = (View) getView.inflate(R.layout.deneme2,null);  
    btn = (Button) deneme2lout.findViewById(R.id.button1); 

} 

public void buttonClick(View v) { 
    if(v.equals(btn)) { 
    deneme2lout.setBackgroundDrawable(getResources().getDrawable(R.drawable.background)); 
    } 
} 

} 

所以我得到的,我不能使用這兩個代碼,所以,我應該怎麼辦呢?點擊第二個佈局上的按鈕時,我需要更改第二個頁面的背景。

這是我的deneme2.xml代碼:

<?xml version="1.0" encoding="utf-8"?> 
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/layout2" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <Button 
     android:id="@+id/button1" 
     android:layout_width="175dp" 
     android:layout_height="95dp" 
     android:layout_x="69dp" 
     android:layout_y="174dp" 
     android:textSize="25dp" 
     android:text="Change" /> 

</AbsoluteLayout> 
+1

感謝您的代碼幫助我。 – Kedarnath 2014-06-11 16:54:07

+0

很高興聽到它:) @Kedarnath – yahya 2014-06-12 06:30:00

回答

2

這是因爲,因爲它解釋,OnClickListener沒有您使用的是OnClickListener內這兩個方法。替換:

LinearLayout l = (LinearLayout) findViewById(R.id.layout2); 

LinearLayout l = (LinearLayout) v.findViewById(R.id.layout2); 

如果它接着說V,則最終的,應該沒問題。並替換:

getResources().getDrawable(R.drawable.background) 

ViewPagerAdapter.this.context.getResources().getDrawable(R.drawable.background) 
+0

謝謝,它的工作=) 但現在,我在這一行上得到NullPointerException: btn.setOnClickListener(...); 這可能是因爲我不在與按鈕相同的佈局...但無法弄清楚如何解決它...任何建議? – yahya 2012-02-01 19:38:03

+0

嗯,以及你仍然使用視圖'V'所以它應該沒問題......你確定button1和layout2存在於那個佈局中? 此外,您的代碼目前實際上並沒有添加View'v',並將OnClickListener設置爲頁面,它添加了View'view'。嘗試改變它,這樣它會爲頂部案例添加'v',爲底部兩個案件添加'view',然後查看它是否有效。 – 2012-02-01 19:51:05

+0

你是對的:)我已經做出了你提到的改變,現在它不會給出任何錯誤...但是點擊它也不會改變背景:/我應該做什麼? (對不起,這很多,但正如我所說我對Android非常新) – yahya 2012-02-01 20:15:21

2

至於你的問題的第二部分,它的簡單!雖然你現在一直使用View v,你仍然可以與新的通脹在年底「覆蓋」它:

int resId = 0; 
switch (position) { 
case 0:   
    resId = R.layout.deneme; 

    break; 
case 1: 
    resId = R.layout.deneme2; 
    // Inflate v the first time 
    v = inflater.inflate(R.layout.deneme2, null, false); 
    @SuppressWarnings("deprecation") 
    final AbsoluteLayout l = (AbsoluteLayout) v.findViewById(R.id.layout2); 
    // Add the OnClickListener to the button, which is associated with the above instance of v  
    btn = (Button) v.findViewById(R.id.button1); 
    btn.setOnClickListener(new OnClickListener() { 
     public void onClick(View m) { 
      l.setBackgroundResource(R.drawable.background); 
     } 
    }); 
    break; 
case 2: 
    resId = R.layout.deneme3; 
} 

// Overwrite the instance of v with the OnClickListener with one without the OnClickListener 
v = inflater.inflate(resId, null); 
((ViewPager) pager).addView(v, 0); 

return v; 

因此,改變以下位應該使它很好地工作:

  • 變化View v = new View(pager.getContext());View v = null;
  • 改變最終膨脹(剛添加視圖之前)到if (v == null) v = inflater.inflate(resId, null);
+0

非常感謝!奇蹟般有效! =) – yahya 2012-02-02 09:17:56

+2

但我可以問一下,是否有辦法處理主類中的按鈕點擊,而不是在PagerAdapter中? – yahya 2012-02-02 17:16:30

+0

我有同樣的問題。這是否解決? – 2014-10-07 16:49:16

0

在respo NSE你最近的問題,你可以設置一個onClick監聽器適配器之外,像這樣的活動中:

public void buttonClick(View v) { 
    //do something 

} 

在你的XML包含按鈕,請確保您有安卓的onClick =「buttonClick」爲1個屬性。

在你的包含按鈕的xml中,確保你有android:onClick =「buttonClick」作爲屬性1。

編輯 - 我不認爲你申請,我從你最近的代碼提示的變化...這裏是我的想法是:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    ViewPagerAdapter adapter = new ViewPagerAdapter(this); 
    ViewPager pager = (ViewPager)findViewById(R.id.viewpager); 
    pager.setAdapter(adapter); 
    pager.setCurrentItem(0); 


    LayoutInflater getView = getLayoutInflater(); 
    deneme2lout = (View) getView.inflate(R.layout.deneme2,null);  

} 

public void buttonClick(View v) { 
    deneme2lout.setBackgroundDrawable(getResources().getDrawable(R.drawable.background)); 
} 

如果這不是它,那麼請讓我們知道錯誤,以便我們可以帶領您朝着正確的方向前進。

+0

你能檢查我的答案嗎?我發佈我的代碼重新排序,如你所說...但仍然無法正常工作。 – yahya 2012-02-02 20:10:31

+0

我假設你仍然有問題,因爲你在if語句中得到一個NullPointer異常。您不需要在buttonClick方法中添加if語句來檢查視圖是否是btn(它是多餘的)。如果有人點擊該按鈕,buttonClick方法將被調用。正因爲如此,我認爲deneme2lout.setBackgroundDrawable(R.drawable.background);應該沒事。 讓我知道它是否有效。 – aimango 2012-02-02 20:57:40

+0

我試過了,並沒有工作......並且我編輯了我的代碼,您可以在那裏檢查它......先謝謝了! – yahya 2012-02-03 08:48:20