0

所以我是 Android 开发的新手,并试图围绕主/细节流程设计。因此,我使用 Eclipse 为您创建的默认类 - so ScreenDetailActivityScreenDetailFragmentScreenListActivityScreenListFragment. 我的一个细节片段使用了一个布局,其中包含一系列用于输入数据的检查和字段,以及一个按钮,该按钮应该使使用片段的 Activity 类将该数据传递给计算器类,然后使用数据。例如,在calculation_layout.xml有问题的 Detail 片段之一使用的文件中找到:

<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" />

我认为我的 Buttoncalculate功能正常工作(即当计算为空或做一些琐碎的事情时应用程序不会崩溃);它在 和 中都实现了ScreenListActivityScreenDetailActivity因为两者都可以使用片段。

但是,每当我尝试访问 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从 Activity 访问,但我真的不知道如何安全有效地做到这一点。

有人可以在这里给我一些指示吗?

更新:

我尝试实现 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();
    }

但是,错误仍然存​​在。如果我将 a重铸ViewParent为 a LinearLayout, aViewGroup或者如果我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 添加到 Fragment 中的按钮即可。像这样的东西:

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)。然后你会在你的 Fragment 上得到一个回调,这就是你在那里所做的:

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

这是最好的例子,有两个fragments headersfragment 和articlefragment 具有动态UI,按照它们在articlefragment 上的接口来选择哪个标题。正确遵循教程。你应该很好理解。

于 2014-02-24T16:45:15.723 回答