show code block

2016年12月21日 星期三

Fragment當Activity使用,在Fragment上設置Button

前言:

許多人會覺得,奇怪我不是已經呼叫(findViewById)了嗎?怎麼我在fragment上的按鈕都完全無效?

其實都忽略了rootView這件事情。
fragment來說必須有底部View,才有辦法呼叫元件做事!




實作:
一開始創建一個Fragment,這會是你FragmentonCreateView

@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);
}
之後把returnView額外拉到全域變數來
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

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呼叫它的時候發現跑紅字了?!


此時要注意你創建的Fragment繼承問題。


必須繼承android.app.Fragment
當然你只要在import的地方使用import android.app.Fragment;
就可以直接extends Fragment

不用extends android.app.Fragment那麼醜!






Fragment全集

Fragment的使用() ─ activity內放置Fragment

Fragment的使用() ─ activity內切換Fragment

Fragment 返回上一頁 OnBackPressed

Fragment點擊穿透

FragmentActivity使用,在Fragment上設置Button - 此篇


沒有留言:

張貼留言

協程(coroutine) - 協程為什麼要學它?

 Coroutine 協程 再強調一次 協程就是由kotlin官方所提供的線程api //Thread Thread { }.start() //Executor val execu...