Android Master / Detail流程 - 在Activity中操作Detail片段视图

时间:2012-12-05 12:04:49

标签: java android android-fragments master-detail

所以我是Android开发的新手,并试图围绕Master / Detail流程设计。因此,我使用Eclipse为您创建的默认类 - 所以ScreenDetailActivityScreenDetailFragmentScreenListActivityScreenListFragment。我的一个Detail片段使用一个布局,其中包含一系列用于输入数据的检查和字段,以及一个应该使用片段将Activity类传递给计算器类的按钮,然后计算器类执行一些基本计算。数据。例如,在一个有问题的详细信息片段使用的calculation_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功能正常工作(即当计算为空或琐碎的事情时,应用程序不会崩溃);它在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,但我真的不知道如何安全有效地做到这一点。

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

更新:

我尝试过实现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并访问其状态。

2 个答案:

答案 0 :(得分: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)。然后你会在你的片段上得到一个回调,这就是你在那里做的事情:

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();
}

答案 1 :(得分:0)

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

这是最好的例子,有两个片段headlinesfragment和articlefragment与动态UI,按照他们如何在articlefragment上的界面,让我们选择哪个标题。正确地遵循教程。你应该理解它。