web-dev-qa-db-ja.com

Android:フラグメントの背景色を変更する

フラグメントの背景色を変更しようとしましたが、小さな問題が発生しました。

public class MainActivity extends FragmentActivity {

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

だから、示されている  フラグメントのXMLファイルを呼び出すメインクラス用に用意したコードです。

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="horizontal" >

    <fragment
        Android:id="@+id/fragment1"
        Android:name="com.northreal.practice.FirstFragment"
        Android:layout_width="0dip"
        Android:layout_height="match_parent"
        Android:layout_weight="1"
        Android:background="#CBA" />

</LinearLayout>

 mainクラス(MainActivity)によって呼び出されるmain.xmlレイアウトです。

public class FirstFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup parent,
            Bundle savedInstanceState) {
        return inflater.inflate(R.layout.main, parent, false);
    }
}

 フラグメントを含むXMLファイルはこのクラスを呼び出します。

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="horizontal"
     >

    <TextView
        Android:id="@+id/tv"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="BLAHHHH"
        Android:layout_gravity="center_vertical" />

</LinearLayout>

このレイアウト  クラスFirstFragmentによって膨張します

それで、なぜこれが私のフラグメントの背景の色を実際に変えないのですか?

25
Brandon Ling

フラグメントはViewを継承しないため、バックグラウンドメソッドを設定しません。

簡単な修正方法は、フラグメントの ルートビューを取得する だけで、その背景を設定することです。

fragment.getView().setBackgroundColor(Color.WHITE);
38
Adam

これが機能しない理由は、フラグメントがアクティビティと同様に扱われるためです。これは、メインアクティビティの子であるコンテナであり、他のアイテムを表示するために使用されます。

Android:background = "#CBA"を、フラグメント自体ではなく、TextViewを保持する実際のレイアウトに配置する必要があります。そのようです:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:background="#CBA"
    Android:orientation="horizontal" >

    <TextView
        Android:id="@+id/tv"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="center_vertical"
        Android:text="BLAHHHH" />
</LinearLayout>
8
Brandon Ling

次のようなフラグメントオブジェクトを取得します。

Fragment fragment = (Fragment) getFragmentManager().findFragmentById(R.id.fragmentId);

背景を次のように変更します。

fragment.getView().setBackgroundColor(Color.WHITE);
3

私は同じ問題に直面しましたが、私の要件は、フラグメントの背景描画可能イメージを設定または変更することでした。 Adamが答えたように、アプローチは正しいので、フラグメントからアクティビティへの接続を示したいと思います。

ベストプラクティスは、 'Connector'(または任意の名前)という名前のインターフェイスを使用することです。その後、フラグメントから:

Connector connector = (Connector) getActivity();
connector.setIt(this);

次に、アクティビティで「コネクタ」インターフェイスを実装し、メソッドを使用します。

@Override
public void setIt(Fragment fragment){
    FirstFragment firstFrag = (FirstFragment) getSupportFragmentManager().findFragmentByTag("first");
    firstFrag.getView().setBackgroundDrawable(getResources().getDrawable(R.drawable.app_background));
    //or for color set
    firstFrag.getView().setBackgroundColor(Color.WHITE);
}
0
Asad