前言:
許多人會覺得,奇怪我不是已經呼叫(findViewById)了嗎?怎麼我在fragment上的按鈕都完全無效?
其實都忽略了rootView這件事情。
對fragment來說必須有底部View,才有辦法呼叫元件做事!
實作:
一開始創建一個Fragment,這會是你Fragment的onCreateView。
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_blank, container, false); }之後把return的View額外拉到全域變數來
private View view;
這View就會是你的rootView了,這時候在fragment上面設置元件才會有效果。
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { view = inflater.inflate(R.layout.fragment_blank, container, false); return view; }
開始控制元件囉。
在平時的findViewById前面加上rootview
Button yourButton=(Button)rootview.findViewById(R.id.button_fragment);
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { view = inflater.inflate(R.layout.fragment_blank, container, false); button = (Button) view.findViewById(R.id.button_fragment); imageView = (ImageView) view.findViewById(R.id.show); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { imageView.setImageResource(R.drawable.hello); } }); return view; }以下是專案所有CODE範例
MainActivity.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/hello" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="hello" android:text="Call Fragment" /> <FrameLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/hello" /> </RelativeLayout>
MainActivity.Java
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void hello(View view) { //最簡易創建fragment的方式 //不建議這樣做,因為初始化(init) fragment的方式被簡略(new BlankFragment()) //會造成在控制fragment上的麻煩 //創建方式詳情請見 //http://nikeru8.blogspot.tw/2016/06/fragment-activity-fragment-activity.html getFragmentManager() .beginTransaction() .add(R.id.container, new BlankFragment()) .commit(); } }
example_fragment.xml 創建的Fragment
<FrameLayout 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:background="@android:color/darker_gray" android:clickable="true" tools:context="com.example.a015865.simplefragment.simpleExample"> //android:clickable="true"防止點擊穿透 <Button android:id="@+id/button_fragment" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Call ImageView" /> <ImageView android:id="@+id/show" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout>
simpleExample.java
Demo打包:
public class simpleExample extends android.app.Fragment { private View view; private ImageView imageView; private Button button; public simpleExample() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { view = inflater.inflate(R.layout.example_fragment, container, false); button = (Button) view.findViewById(R.id.button_fragment); imageView = (ImageView) view.findViewById(R.id.show); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { imageView.setImageResource(R.drawable.hello); } }); return view; } }
Demo打包:
可能會遇到的問題:
當你創建了Fragment,在Activity呼叫它的時候發現跑紅字了?!必須繼承android.app.Fragment
當然你只要在import的地方使用import android.app.Fragment;
就可以直接extends Fragment
不用extends android.app.Fragment那麼醜!
Fragment全集
Fragment的使用(一) ─ 在activity內放置Fragment
Fragment的使用(二) ─ 在activity內切換Fragment
Fragment 返回上一頁 - OnBackPressed
Fragment點擊穿透
Fragment當Activity使用,在Fragment上設置Button - 此篇