【问题标题】:Android Fragment ButtonAndroid 片段按钮
【发布时间】:2018-03-26 23:33:28
【问题描述】:

我正在创建一个具有底部导航视图的简单应用程序。

这将把用户带到不同的类别之间。这是使用 Fragments 和案例系统设置的

然后,我想要这些类别页面上的按钮,这些按钮将您带到其他页面,并在每个页面的底部提供导航。

当我将我在此应用程序的先前版本中使用的按钮代码放入时,它无法显示 error: cannot find symbol method findViewById(int)

经过一些阅读,我可以看到这不适用于片段,但我找不到任何清晰或易于理解的关于如何使这些工作的内容。

简而言之,我希望导航面板在我加载的任何页面上保持不变,而不仅仅是我在面板中列出的类别页面。

任何字母页面和按钮的其他链接都需要在导航栏上方的面板中打开,但我不知道如何实现这一点。

任何帮助都会...有帮助。我花了大约 12 个小时尝试各种事情,但无济于事。

处理导航片段的代码:

package breed.sheep.british.com.britishsheepbreeds;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.design.widget.CoordinatorLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;

import breed.sheep.british.com.britishsheepbreeds.fragment.BreedsFragment;
import breed.sheep.british.com.britishsheepbreeds.fragment.ColoursFragment;
import breed.sheep.british.com.britishsheepbreeds.fragment.DefaultFragment;
import breed.sheep.british.com.britishsheepbreeds.fragment.TerminologyFragment;
import breed.sheep.british.com.britishsheepbreeds.fragment.TypeFragment;
import breed.sheep.british.com.britishsheepbreeds.helper.BottomNavigationBehavior;

public class MainActivity extends AppCompatActivity {

private ActionBar toolbar;

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

    toolbar = getSupportActionBar();

    BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
    BottomNavigationBehavior.disableShiftMode(navigation);
    navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);




    // attaching bottom sheet behaviour - hide / show on scroll
    CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) navigation.getLayoutParams();
    layoutParams.setBehavior(new BottomNavigationBehavior());

    // load the default fragment
    toolbar.setTitle("British Sheep Breeds");
    loadFragment(new DefaultFragment());
}

private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
        = new BottomNavigationView.OnNavigationItemSelectedListener() {

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        Fragment fragment;
        switch (item.getItemId()) {
            case R.id.home:
                toolbar.setTitle("British Sheep Breeds");
                fragment = new DefaultFragment();
                loadFragment(fragment);
                return true;
            case R.id.breeds:
                toolbar.setTitle("Breeds A-Z");
                fragment = new BreedsFragment();
                loadFragment(fragment);
                return true;
            case R.id.colour:
                toolbar.setTitle("Colours");
                fragment = new ColoursFragment();
                loadFragment(fragment);
                return true;
            case R.id.type:
                toolbar.setTitle("Type ");
                fragment = new TypeFragment();
                loadFragment(fragment);
                return true;
            case R.id.term:
                toolbar.setTitle("Terminology ");
                fragment = new TerminologyFragment();
                loadFragment(fragment);
                return true;


        }

        return false;
    }
};

/**
 * loading fragment into FrameLayout
 *
 * @param fragment
 */
private void loadFragment(Fragment fragment) {
    // load fragment
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.frame_container, fragment);
    transaction.addToBackStack(null);
    transaction.commit();
} }

片段页面

package breed.sheep.british.com.britishsheepbreeds.fragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import breed.sheep.british.com.britishsheepbreeds.R;


public class DefaultFragment extends Fragment {

    public DefaultFragment() {
        // Required empty public constructor
    }

    public static DefaultFragment newInstance(String param1, String param2) {
        DefaultFragment fragment = new DefaultFragment();
        Bundle args = new Bundle();
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,

                             Bundle savedInstanceState) {

        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_main, container, false);
    }
}

上一个按钮代码

Button balwen = (Button) findViewById(R.id.balwen);
        balwen.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                Intent myIntent = new Intent(view.getContext(), balwen.class);
                startActivityForResult(myIntent, 0);
                    }


                }); 

【问题讨论】:

  • 您可能希望将按钮代码添加到每个特定片段并运行类似于您在主页上为导航所做的操作,因此通常:在每个片段布局中,该按钮并在他们的类中正确地从 onCreateView 调用该按钮,然后您可以在 onclick 函数中输出导航代码。希望对您有所帮助。
  • 我不明白你的意思,你能详细说明吗?
  • 你想要每个类别页面上的按钮,这意味着你将把按钮放在每个页面中并执行你的点击功能,我说的是找不到符号方法 findViewById(int) 你可能会被调用按钮来自错误的位置,所以从每个片段的 onCreate 视图中调用按钮,给我几分钟让我写一个示例代码。

标签: android button navigation fragment


【解决方案1】:
Button balwenLeft, balwenRight;
FragmentManager fragmentManager;
Fragment fragment;

public Timeline() {
    // Required empty public constructor
}

public static Timeline newInstance(String param1, String param2) {
    Timeline fragment = new Timeline();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }
    fragmentManager = this.getActivity().getSupportFragmentManager();
}

@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container,
                         Bundle savedInstanceState) {
    final LinearLayout l = (LinearLayout) inflater.inflate(R.layout.fragment_colours, container, false);

    fragment = new FirstPageOnBreedFragment();
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    transaction.replace(R.id.channelactivitycontainer, fragment).commit();

    balwenLeft = (Button) l.findViewById(R.id.btnLeft);
    balwenLeft.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            fragment = new AnotherFragmentWithInBreedFrag();
            FragmentTransaction transaction = fragmentManager.beginTransaction();
            transaction.replace(R.id.frame_container, fragment).commit();
        }
    });

    balwenRight = (Button) l.findViewById(R.id.btnRight);
    balwenRight.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            fragment = new AnotherFragmentWithInBreedFrag();
            FragmentTransaction transaction = fragmentManager.beginTransaction();
            transaction.replace(R.id.frame_container, fragment).commit();
        }
    });

    return l;

所以这看起来像您可能想要做的,实际发生的是从每个片段作为一个类别,您将在布局上创建自定义导航按钮,并在从片段调用它时, 不要忘记你需要像我一样膨胀片段的布局,片段布局的父布局在我的例子中是LinearLayout,所以如果你使用关联布局或 Coor... 只需更改它们分别回到导航,发生的事情是我正在对其进行硬编码,但您可以用实际上更简单的开关盒功能替换它,所以如果您在 BreedsFragment 上,您将有两个按钮可以帮助您导航在 BreedFrag 中的页面之间... 通常我们只是替换 frame_container 中存在的任何内容,就像底部导航所做的那样,当您单击按钮时会发生同样的事情,但在这种情况下,您仍然在同一个页面上,请注意,我假设这些页面也是片段。我希望你能理解,否则如果你可以在 gitHub 上分享你的代码,我可以帮助它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 2013-09-13
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多