2014-01-25 38 views
0

我的測試項目有一個主要活動如下:安卓:從片段中處理用戶輸入

public class MainActivity extends Activity { 

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

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.display_message, menu); 
     return true; 
    } 

    public void sendMessage(View view){ 
     FragmentManager frManager = getFragmentManager(); 
     FragmentTransaction transaction = frManager.beginTransaction(); 
     Frag fr= new Frag(); 
     transaction.add(R.id.stuuf, fr); 
     transaction.addToBackStack(null); 
     transaction.commit(); 
    } 
} 

而且主要有以下佈局:

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/stuuf" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" 
    android:paddingTop="?android:attr/actionBarSize" > 

    <Button android:id="@+id/submit_button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/button_send" 
     android:onClick="sendMessage"/> 

    </TableLayout> 

當用戶點擊該按鈕以下片段顯示包含第二個按鈕:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    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=".Frag" > 

    <Button 
     android:id="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="180dp" 
     android:onClick="buttonClicked" 
     android:text="Button" /> 
    </RelativeLayout> 

而這個類應該是控制它:

public class Frag extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     return inflater.inflate(R.layout.frag_test, null); 
    } 

    public void buttonClicked(){ 
     System.out.println("Hello!"); 
    } 

} 

現在,有,當我點擊第二個按鈕,系統進入尋找在MainActivity而不是在破片的buttonClicked()方法的問題,由此給我下面的錯誤:

java.lang.IllegalStateExcetion: Could not find method buttonClicked(View) in the activity class com.spacitron.mytestproject.MainActivity for onClick handler on view class android.widget.Button with id 'button1' 

很顯然,我應該能夠處理從片段類本身,所以我必須做一些完全錯誤的片段會發生什麼,我只是不能找出什麼。

回答

2

它看起來像你錯過了一些步驟,把這個在你的第二個片段(從XML中刪除的onClick)

public void onViewCreated(View view, ...) { 

    View btn = view.findViewById(R.id.button1); 
    btn.setOnClickListener(new View.OnClickLisener() { 

     public void onClick(View view) { 
      Log.d("My App", "The button was clicked"); 
     } 

    } 

} 
2

的問題是,你使用的片段佈局onClick方法而Android正期待在該活動中找到它。有兩種方法來解決這個問題:

  1. 最健康:從XML刪除onClick屬性和依靠OnClickListener實現。
  2. 將來自活動的調用委託給片段 - 在活動中聲明方法並將其委託給片段。類似下面:

在活動類有這樣的:

public void buttonClicked(View view){ 
    Fragment current = getFragmentManager().findFragmentById(R.id.stuuf); 
    if(current != null) { 
     ((Frag)current).buttonClicked(); 
    } 
} 

從長遠來看,我會強烈建議不要使用onClick XML屬性。原因在this SO answer中解釋。

0

片段構建在活動之上,onClick屬性與活動相關聯。

我會建議你使用ClickListeners兩個按鈕: -

@Override 
public void onViewCreated((View view, Bundle savedInstanceState) { 
Button fragmentButton = (Button)view.findViewById(R.id.button1); 
fragmentButton.setOnClickListener(new View.OnClickLisener() { 

    public void onClick(View view) { 
     //Do Something here 
    } 

}); 

}