2014-08-27 39 views
0

有沒有更好的方法來啓動一個新的按鈕點擊活動比使用onClick屬性來指定一個回調方法,如下面的例子?有沒有更好的方式來啓動一個新的活動按鈕點擊調用onClickListener?

--- XML ---

<Button 
    android:id="@+id/button1" 
    android:onClick="someMethod" 
    android:text="@string/someString" /> 

--- java的---

public void someMethod(View view) { 
    startActivity(new Intent(this, SomeActivity.class)); 
} 

我寧願要指定活動的名稱比的名字開始一個回調方法。就像這樣:

<Button 
    android:id="@+id/button1" 
    android:onClick="SomeActivity" 
    android:text="@string/someString" /> 
  • 我不想繼承Button類。
  • 我不想爲所有按鈕指定相同的回調方法,並且在啓動正確活動的回調方法中有一個開關大小寫。
  • 添加自定義XML屬性所指定活動啓動按鈕(如果可能的話?)
+0

我不理解。你想實現自定義佈局xml行爲,但你不想使用自定義xml屬性來做到這一點? – 2014-08-27 13:26:24

+0

自定義xml屬性是確定的。我想避免使用Button的子類,或者讓所有按鈕都指定相同的回調方法,並且有一個switch語句來選擇要開始的活動。 – Robert 2014-08-27 13:42:19

+0

然後爲每個Button指定不同的onClick屬性值,或動態設置它們的OnClickListener。沒有子類化,你不能實現自定義的xml屬性。 – 2014-08-27 13:46:31

回答

1

這是我想出了感謝和柔術邁克M.

的活動時,按下按鈕開始使用Android的規定是:標籤XML屬性和構造器將設置onClickListeners所有視圖中的按鈕。

這樣我就不必:

  1. 實現對每個按鈕的onClick方法。
  2. 使用處理所有按鈕的switch語句實現一個常見的onClick方法。
  3. 子類Button。
  4. 創建我自己的xml屬性。

--- XML ---

<RelativeLayout xmlns:tools="http://schemas.android.com/tools" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/MainActivity" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.example.playground.MainActivity" > 

     <Button 
      android:id="@+id/button1" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:tag="showActivity" 
      android:text="@string/somestring" /> 
</RelativeLayout> 

--- java的---

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     connectButtonClickListeners(findViewById(R.id.MainActivity)); 
    } 

    // Walk down the View tree starting with parent and connect an onClickListener to each Button. 
    private void connectButtonClickListeners(View parent) { 
     if (parent == null) 
      return; 

     LinkedList<View> list = new LinkedList<View>(); 
     list.add(parent); 

     while (list.isEmpty() == false) { 
      View v = list.pollFirst(); 
      if (v instanceof ViewGroup) { 
       ViewGroup vg = (ViewGroup) v; 
       for (int i = 0; i < vg.getChildCount(); i++) 
        list.add(vg.getChildAt(i)); 
      } else if (v instanceof Button) { 
       Button b = (Button) v; 
       b.setOnClickListener(new View.OnClickListener() { 
        public void onClick(View v) { 
         // TODO: Start the new Activity. 
         System.out.println("Clicked!" + v.getTag()); 
        } 
       }); 
      } 
     } 
0

很簡單。子類Button在一個單獨的類文件,MySpecialButton.java

public class MySpecialButton extends Button { 
    public MySpecialButton(Context context) { 
    super(context); 
    setupOnClickListener(); 
    } 
    public MySpecialButton(Context context, AttributeSet attrs) { 
    super(context); 
    setupOnClickListener(); 
    } 
    public MySpecialButton(Context context, AttributeSet attrs, int defStyle) { 
    super(context); 
    setupOnClickListener(); 
    } 

    protected void setupOnClickListener() { 
    setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
      startActivity(...); 
      } 
    }); 
    } 
} 

我還沒有編譯這段代碼,我寫的匆忙,但應該工作。

然後在您的XML中,而不是Button聲明您的視圖爲com.yourpacket.yourappname.yourpackage.MySpecialButton

編輯: 你需要在代碼中添加一些東西,但你應該管理(上下文引用,導入語句等)。

+1

謝謝,但正如我之前寫的,我不認爲這是一個很好的做法.. – Robert 2014-08-27 12:58:53

1

作爲解決方案,我會推薦以下內容。請原諒僞似非編譯(可能)代碼:

Button a = findViewById(R.id.button1); 
Button b = findViewById(R.id.button2); 

// Strings to be fed to the intent. You can use YourActivity.getClass() as well here 
String mFirstTag = "your.first.activity.class" 
String mSecondTag = "your.second.activity.class" 

// This is critical as it will be used by the listener 
a.setTag(mFirstTag); 
b.setTag(mSecondTag); 

// Self explanatory 
a.setOnClickListener(mClickListener); 
b.setOnClickListener(mClickListener); 


// This listener will grab the "tag" object from the clicked view. 
// It will be the same tag which we previously set on those buttons. 
private OnClickListener mClickListener = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Intent i = new Intent(v.getTag()); // Maybe you'll need toString(), or a cast here 
     startActivity(i); 
    } 
} 

我希望你能得到大致的想法。

+0

它給了我一些想法。謝謝! – Robert 2014-08-27 14:17:13

0

我喜歡這種方法。不需要switch語句。

每個按鈕都得到相同的onClickListener,用類名稱爲新的活動標籤:

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:onClick="startActivityForTag" 
    android:tag=".HelloActivity" 
    android:text="Say hello" > 
</Button> 

的點擊收聽從視圖標籤contructs類:

public void startActivityForTag(View v) { 
    String name = v.getTag().toString(); 
    // if name is not fully-qualified, add the package name 
    if (name.startsWith(".")) { 
     name = getPackageName() + name; 
    } 
    try { 
     startActivity(new Intent(this, Class.forName(name))); 
    } catch (ClassNotFoundException e) { ; } 
} 
相關問題