0

だから私はAndroid開発に不慣れで、マスター/ディテールフローデザインに頭を悩ませようとしています。そのため、私はEclipseが作成するデフォルトのクラスを使用しています-つまりScreenDetailActivity、、、、および。私の詳細フラグメントの1つは、データを入力するための一連のチェックとフィールドを含むレイアウトを使用し、フラグメントを使用してActivityクラスがそのデータを計算機クラスに渡すようになっているボタンを使用します。計算機クラスは、データ。たとえば、問題の詳細フラグメントの1つで使用されているファイルにあります。ScreenDetailFragmentScreenListActivityScreenListFragmentcalculation_layout.xml

<EditText android:id="@+id/edit_value"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:inputType="numberDecimal|numberSigned"
      android:hint="@string/background_value" />

<Button android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:text="@string/button_singleCalc"
    android:onClick="calculate" />

私はボタンのcalculate機能が機能していると思います(つまり、計算が空の場合や些細なことをしてもアプリはクラッシュしません)。どちらかがフラグメントを使用している可能性があるため、 ScreenListActivityとの両方に実装されています。ScreenDetailActivity

ただし、DetailフラグメントのEditTextオブジェクトにアクセスしようとすると、アプリがクラッシュします。私はこのようなことを試みています:

public void calculate(View view){
    //Retrieve all the information, and set the values in the Calculator
    EditText editText = (EditText) findViewById(R.id.edit_value);
    String number = editText.getText().toString();
    double angle = Double.parseDouble(number);

    Calculator.longCalc();
}

そして、このようにScreenDetailFragmentのレイアウトを膨らませます。これは、Eclipseによって生成されるデフォルトのメソッドがどのように機能するかとは異なります(mItemは基本的に、フラグメントを破棄する必要がある情報を含む小さなクラスのインスタンスです)。

public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // The returned view
        View rootView;
        // If mItem is non-null...
        if (mItem != null) {
            if (mItem.title == "Calculation") {
                // If the title is Calculation, use the calculation layout
                rootView = inflater.inflate(R.layout.calculation_layout, container, false);
            } else {
                // Otherwise, show the dummy content as text in a TextView
                rootView = inflater.inflate(R.layout.fragment_screen_detail, container, false);
                ((TextView) rootView.findViewById(R.id.screen_detail)).setText(mItem.title);
            }
        } else {
            rootView = inflater.inflate(R.layout.fragment_screen_detail, container, false);
        }

        return rootView;
    }

前に述べたように、結果はクラッシュです。

私がやるべきことは、どういうわけかrootViewアクティビティからのアクセスだと思いますが、それを安全かつ効果的に行う方法が本当にわかりません。

誰かが私にここでいくつかのポインタを与えることができますか?

アップデート:

私はOnClickListenerを実装してみましたが、その特定のレイアウトが膨らんだときにそのように設定しました。

((Button)rootView.findViewById(R.id.button_calc)).setOnClickListener(this);

onClick(View)関数を次のように実装します。

public void onClick(View view) {
        //Retrieve all the information, and set the values in the Calculator
        view = (View) view.getParent();
        EditText editText = (EditText) layout.findViewById(R.id.edit_phiD);
        String number = editText.getText().toString();

        Calculator.angle = Double.parseDouble(number) * 2.0 * Math.PI/360.0;

        Calculator.longCalc();
    }

ただし、エラーは解決しません。を、、にリキャストした場合、またはそのまま使用した場合にもViewParent持続LinearLayoutViewGroupますview。明確にするために、クリックされたボタンの親レイアウトを取得しようとしています。これにより、そのレイアウトの他の子に戻ってViews、それらの状態にアクセスできるようになります。

4

2 に答える 2

1

これを達成するためにあなたの活動を経験する必要はありません。onclick行を削除し、レイアウトにボタンのIDを追加します。

<Button android:id="@+id/calc_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content" 
android:text="@string/button_singleCalc" />

次に、フラグメント内のボタンにOnClickListenerを追加するだけです。そんな感じ:

private View mRootView;
private  EditText mEditText;

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // If mItem is non-null...
    if (mItem != null) {
        if (mItem.title == "Calculation") {
            // If the title is Calculation, use the calculation layout
            mRootView = inflater.inflate(R.layout.calculation_layout, container, false);
            mEditText = (EditText) mRootView.findViewById(R.id.edit_phiD);    
            ((Button)mRootView.findViewById(R.id.calc_button)).setOnClickListener(this);         
        } else {
            // Otherwise, show the dummy content as text in a TextView
            mRootView = inflater.inflate(R.layout.fragment_screen_detail, container, false);
            ((TextView) mRootView .findViewById(R.id.screen_detail)).setText(mItem.title);
        }
    } else {
        mRootView = inflater.inflate(R.layout.fragment_screen_detail, container, false);
    }

    return mRootView;
}

(フラグメントは、このためにOnClickListenerを実装する必要があります)。次に、フラグメントでコールバックを受け取ります。そこで行うことは次のとおりです。

public void onClick(View v){
    //Retrieve all the information, and set the values in the Calculator
    String number = mEditText.getText().toString();
    double angle = Double.parseDouble(number);

    Calculator.longCalc();
}
于 2012-12-05T12:15:26.920 に答える
0

https://developer.android.com/training/basics/fragments/index.html

これが最良の例です。動的UIを備えたheadlinesfragmentとarticlefragmentの2つのフラグメントがあり、articlefragmentのインターフェイスがどのようになっているのかに従って、どちらの見出しを選択できるようにします。チュートリアルに正しく従ってください。あなたはそれをよく理解する必要があります。

于 2014-02-24T16:45:15.723 に答える