0

まず第一に、私がやっていることが正しいか間違っているかを知るために、何かを尋ねたい. 私は車のメディア用のインターフェースを開発しています。これは、Android の在庫を超えているはずです。

fisical ボタンがないので、ナビゲーター、電話、チューナーなどにアクセスできる imagebuttos を備えた、それぞれが片側にある 2 つの境界線で構成される menu_layout を作成しました...

このレイアウト内には、必要なもの (メディア、ナビゲーター、電話など) に対応するレイアウトを動的に追加する FrameLayout があります。

メイン レイアウトは FragmentActivity であり、他の「アクティビティ」をフラグメントとして設定します。

しかし、これを行うと、一部のフレームで機能が失われるため、...

このフラグメントを FragmentActivities として定義できますか? または、コンテナーに動的に設定できるようにするには、フラグメントでなければなりませんか?

1つのフラグメントがPhoneViewであるため、これを尋ねます。このフラグメントには、ダイヤラーとして機能するカスタム Imagebuttons の定義が含まれています。また、この frament は、カスタム ダイヤラーを定義するために必要な editext、imagebuttons などでレイアウトを膨らませます。

しかし、実行すると、次のようになります。

java.lang.ClassCastException: android.widget.Imagebuttonこの行で:

button1 = (ImageButton) getActivity().findViewById(R.id.one); ダイヤラーの最初のボタンを定義するとき。

これは、フラグメントがこの種のリソースでレイアウトを膨らませることができないためですか??

更新 -- コードが追加されました

phone_view.xml

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

    <!-- Layout for the dialer -->
<LinearLayout 
    android:id="@+id/Right_layout"
    android:layout_width="fill_parent"        
    android:layout_height="fill_parent"
    android:layout_weight="1"
    android:orientation="vertical"
    android:layout_marginStart="@dimen/dialpad_horizontal_margin"
    android:background="#000000" > 

    <!-- Text field above the keypad where the digits are displayed -->
    <LinearLayout
        android:id="@+id/digits_container"
        android:layout_width="match_parent"
        android:layout_height="0px"
        android:layout_weight="@integer/dialpad_layout_weight_digits"
        android:layout_marginTop="@dimen/dialpad_vertical_margin"
        android:gravity="center"
        android:background="@drawable/dialpad_background" >

        <EditText
            android:id="@+id/digits"
            android:layout_width="0dip"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:gravity="center"
            android:scrollHorizontally="true"
            android:textAppearance="@style/DialtactsDigitsTextAppearance"
            android:focusableInTouchMode="false"
            android:nextFocusRight="@+id/deleteButton"
            android:background="@android:color/transparent" />

        <ImageButton
            android:id="@+id/deleteButton"
            android:layout_width="56dip"
            android:layout_height="50dip"
            android:layout_gravity="center_vertical"
            android:gravity="center"
            android:state_enabled="false"
            android:contentDescription="@string/description_delete_button"
            android:src="@drawable/ic_dial_action_delete" />
    </LinearLayout>

    <!-- The dialpad itself -->
    <include layout="@layout/dialpad" />

    <View
       android:layout_width="match_parent"
       android:layout_height="@dimen/dialpad_vertical_margin"
       android:background="#66000000"/>

    <FrameLayout
        android:id="@+id/dialButtonContainer"
        android:layout_width="match_parent"
        android:layout_height="0px"
        android:layout_weight="@integer/dialpad_layout_weight_additional_buttons"
        android:layout_gravity="center_horizontal"
        android:background="@drawable/dialpad_background">

        <ImageButton
            android:id="@+id/dialButton"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:state_enabled="false"
            android:background="@drawable/btn_call"
            android:contentDescription="@string/description_dial_button"
            android:src="@drawable/ic_dial_action_call" />

</FrameLayout>        
</LinearLayout>

Dialpad.xml

<TableLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dialpad"
android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="@integer/dialpad_layout_weight_dialpad"
android:layout_gravity="center_horizontal"
android:layout_marginTop="@dimen/dialpad_vertical_margin"
android:paddingStart="5dip"
android:paddingEnd="5dip"
android:paddingBottom="10dip"
android:background="@drawable/dialpad_background"
android:layoutDirection="ltr">

<TableRow
     android:layout_height="0px"
     android:layout_weight="1" >
    <ImageButton 
        android:id="@+id/one" 
        style="@style/DialpadButtonStyle"
        android:src="@drawable/dial_num_1_no_vm_wht"
        android:contentDescription="@string/description_image_button_one" />
    <ImageButton 
        android:id="@+id/two" 
        style="@style/DialpadButtonStyle"
        android:src="@drawable/dial_num_2_wht"
        android:contentDescription="@string/description_image_button_two" />
    <ImageButton 
        android:id="@+id/three" 
        style="@style/DialpadButtonStyle"
        android:src="@drawable/dial_num_3_wht"
        android:contentDescription="@string/description_image_button_three" />
</TableRow>

<TableRow
     android:layout_height="0px"
     android:layout_weight="1">
    <ImageButton 
        android:id="@+id/four" 
        style="@style/DialpadButtonStyle"
        android:src="@drawable/dial_num_4_wht"
        android:contentDescription="@string/description_image_button_four" />
    <ImageButton 
        android:id="@+id/five" 
        style="@style/DialpadButtonStyle"
        android:src="@drawable/dial_num_5_wht"
        android:contentDescription="@string/description_image_button_five" />
    <ImageButton 
        android:id="@+id/six" 
        style="@style/DialpadButtonStyle"
        android:src="@drawable/dial_num_6_wht"
        android:contentDescription="@string/description_image_button_six" />
</TableRow>

<TableRow
     android:layout_height="0px"
     android:layout_weight="1">
    <ImageButton 
        android:id="@+id/seven" 
        style="@style/DialpadButtonStyle"
        android:src="@drawable/dial_num_7_wht"
        android:contentDescription="@string/description_image_button_seven" />
    <ImageButton 
        android:id="@+id/eight" 
        style="@style/DialpadButtonStyle"
        android:src="@drawable/dial_num_8_wht"
        android:contentDescription="@string/description_image_button_eight" />
    <ImageButton 
        android:id="@+id/nine" 
        style="@style/DialpadButtonStyle"
        android:src="@drawable/dial_num_9_wht"
        android:contentDescription="@string/description_image_button_nine" />
</TableRow>

<TableRow
     android:layout_height="0px"
     android:layout_weight="1">
    <ImageButton 
        android:id="@+id/star" 
        style="@style/DialpadButtonStyle"
        android:src="@drawable/dial_num_star_wht"
        android:contentDescription="@string/description_image_button_star" />
    <ImageButton 
        android:id="@+id/zero" 
        style="@style/DialpadButtonStyle"
        android:src="@drawable/dial_num_0_no_plus_wht"
        android:contentDescription="@string/description_image_button_zero" />
    <ImageButton 
        android:id="@+id/pound" 
        style="@style/DialpadButtonStyle"
        android:src="@drawable/dial_num_pound_wht"
        android:contentDescription="@string/description_image_button_pound" />
</TableRow>

PhoneView.java

public class PhoneView extends Fragment{
...

    ImageButton dialBtn;
    ImageButton clearBtn;
    EditText numTxt;
    ImageButton button1;
    ImageButton button2;
    ...

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    mRoot = inflater.inflate(R.layout.phone_view, null);
    return mRoot;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    setRetainInstance(true);
    ...

    button1 = (Imagebutton) getActivity().findViewById(R.id.one);
    ...

    /**Button1*/
    button1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Set1(v);
        }
    });
}

public void Set1 (View view) {
    numTxt.setText(numTxt.getText()+"1");
}

更新 2 -- LogCat の新しいエラー

.getActivity() を .getVew() に変更した後、LogCat でこれを取得しています。

android.view.InflateException: バイナリ XML ファイルの行 #20: クラスの膨張エラー

この行で:mRoot = inflater.inflate(R.layout.phone_view, null); from the onCreateView()

ほぼ最後に次のように述べています。Caused by: android.content.res.ResourcesNotFoundException: Resource is not a Drawable (color or path): TypedValue{t=0x2/d=0x101030e a=2}

at android.view.View.<init>
at android.widget.ImageView.<init>
at android.widget.ImageView.<init>
at android.widget.ImageView.<init>

ImageButton の代わりにダイヤルパッドで Button を使用して同じコードを試したところ、うまくいきました。しかし、Imagebuttons が必要です。

更新 3 --

おそらく、これを実現しているスタイル定義です。何が間違っているのかを確認するには、次のようにします。

<style name="DialpadButtonStyle">
    <item name="android:layout_width">0dip</item>
    <item name="android:layout_height">match_parent</item>
    <item name="android:layout_weight">1</item>
    <item name="android:background">?android:attr/selectableItemBackground</item>
    <item name="android:soundEffectsEnabled">false</item>
</style>
4

2 に答える 2

3

先ほど言ったように、アクティビティ階層でボタンを探していますが、それは Fragment ビュー階層に属しています。変化する

button1 = (Imagebutton) getActivity().findViewById(R.id.one);

button1 = (Imagebutton) getView().findViewById(R.id.one);

ClassCastExceptionそれでも、なぜ代わりに を取得しているのかわかりませんNullPointerException。再度実行する前に、プロジェクトをクリーンアップして再構築します

于 2013-11-08T12:09:37.013 に答える
0

メインアクティビティではなく、どのフラグメントが膨張しているかでコンポーネントを見つける必要があります。フラグメントのレイアウトで検索

button1 =(Imagebutton) mRoot.findViewById(R.id.one);
于 2013-11-08T12:09:41.863 に答える