【问题标题】:Dynamically creating two fragments that differentiate between the two in same activities动态创建两个片段,在相同的活动中区分两者
【发布时间】:2015-11-19 20:14:09
【问题描述】:

所以我已经搜索了几个小时试图找到这个我遇到的具体问题的答案,但没有运气。如果有人可以帮助我,那就太好了。

所以基本上我有一个 MainActivity.java、FragmentA.java、activity_main.xml 和 fragment.xml。因此,fragment.xml 只是一个在框中有 3 个按钮的容器,当按下 Start 时,会显示一个从 3 开始的数字作为按钮文本。因此,当您再次单击按钮时,它会将按钮文本更改为 2,然后是 1,然后是 0,然后再返回 3。所有减少数字并将按钮文本更改为该数字的逻辑都在 FragmentA.java 类中。所有这些逻辑都有效,我已经测试过了。最后,当单击操作栏中的添加按钮时,我会动态创建 FragmentA 并将其添加到 MainActivity 的 activity_main.xml LinearLayout。

所以现在当您在 MainActivity 的操作栏中按下添加按钮时,fragment.xml 视图会正确附加到 activity_main.xml 的 LinearLayout。问题是,当单击按钮时,只有添加到 LinearLayout 中的第一个片段在工作(数字递减)。其他片段副本没有工作或做任何事情,只是显示。所以按钮递减逻辑仅适用于第一个添加的视图。这是为什么?我认为片段的目的是消除重复。我猜这是多次创建同一个片段的一些 ID 问题?关于如何解决这个问题的任何想法?

FragmentA.java

Button b1, b2, b3;
int[] mCounter = {3, 3, 3};


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

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    b1 = (Button) getActivity().findViewById(R.id.button);
    b1.setOnClickListener(this);
    b2 = (Button) getActivity().findViewById(R.id.button2);
    b2.setOnClickListener(this);
    b3 = (Button) getActivity().findViewById(R.id.button3);
    b3.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    switch(v.getId()) {
        case R.id.button:
            b1.setText(Integer.toString(mCounter[0]));
            decrementCounterByButtonPosition(0);
            break;
        case R.id.button2:
            b2.setText(Integer.toString(mCounter[1]));
            decrementCounterByButtonPosition(1);
            break;
        case R.id.button3:
            b3.setText(Integer.toString(mCounter[2]));
            decrementCounterByButtonPosition(2);
            break;
    }
}

public void decrementCounterByButtonPosition(int counterId) {
    if (mCounter[counterId] != 0) {
        mCounter[counterId]--;
    } else {
        mCounter[counterId] = 3;
    }
}

MainActivity.java

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

@Override
public boolean onCreateOptionsMenu(Menu menu) {        
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

    if (id == R.id.action_add_exercise) {
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        FragmentA ContainerFragment = new FragmentA();
            fragmentTransaction.add(R.id.container, ContainerFragment, "HELLO");
        fragmentTransaction.commit();
        return true;
    }

    return super.onOptionsItemSelected(item);
}

activity_main.xml

<ScrollView
xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"
android:background="#1FDA9A">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
    android:orientation="vertical"
    android:id="@+id/container">
</LinearLayout>

fragment.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="0dp"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity" >

<LinearLayout
    android:id="@+id/globalContainer"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="10dp">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:background="#fff"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:backgroundTint="#333"
        android:gravity="center_vertical|center_horizontal">

        <Button
            style="?android:attr/buttonStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/button"
            android:maxWidth="10dp"
            android:maxHeight="10dp"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp" />

        <Button
            style="?android:attr/buttonStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/button2"
            android:maxWidth="10dp"
            android:maxHeight="10dp"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp" />

        <Button
            style="?android:attr/buttonStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/button3"
            android:maxWidth="10dp"
            android:maxHeight="10dp"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp" />
    </LinearLayout>
</LinearLayout>

任何帮助表示赞赏。谢谢:D

【问题讨论】:

    标签: java android xml android-layout android-fragments


    【解决方案1】:

    我不太确定,但我认为问题出在 ContainerFragment 对象上

    FragmentA ContainerFragment = new Fragment();

    尝试将其更改为:

    FragmentA ContainerFragment = new FragmentA();

    如果你不能传递对象fragmentTransaction.add 这样做:

    android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
    android.support.v4.app.FragmentTransaction fragmentTransaction = 
                                                           fragmentManager.beginTransaction();
    

    我希望这会有所帮助。

    【讨论】:

    • 感谢阿卜杜拉的回复!所以实际上这应该是“= new FragmentA()”,当我发布这个问题时我只是有一个错字。但无论如何......不幸的是,这似乎没有做任何事情。
    • 哦,,,无论如何我很高兴你的问题得到了解决
    【解决方案2】:

    除了 Abdullah Asendar 的回答,你还有一件事要解决。

    问题在于您获取观点的方式。

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        b1 = (Button) getActivity().findViewById(R.id.button);
        b1.setOnClickListener(this);
        b2 = (Button) getActivity().findViewById(R.id.button2);
        b2.setOnClickListener(this);
        b3 = (Button) getActivity().findViewById(R.id.button3);
        b3.setOnClickListener(this);
    }
    

    这会从 Activity 中找到视图,而不是从您的片段中。

    正确的做法是:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment, container, false);
        b1 = (Button) v.findViewById(R.id.button);
        b1.setOnClickListener(this);
        b2 = (Button) v.findViewById(R.id.button2);
        b2.setOnClickListener(this);
        b3 = (Button) v.findViewById(R.id.button3);
        b3.setOnClickListener(this);
        return v;
    }
    

    并摆脱您的 onActivityCreated 覆盖,因为它不再做任何特别的事情。

    注意细微的变化View v = inflater.inflate(R.layout.fragment, container, false);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多