【问题标题】:Android Layout Issue: Getting the Namespace Right [duplicate]Android 布局问题:获取正确的命名空间 [重复]
【发布时间】:2015-08-17 13:46:21
【问题描述】:

好的。我已经看到了很多类似的问题,但可能我的问题太基本了(即愚蠢的 n00b 问题),以至于没有人费心去问。

我对 Android 编程还是很陌生,或者在“工业”能力中使用 Java(即不解决简单的 10 行课堂问题)。

我有一个带有嵌入式静态类的活动类:

package com.example.android.effectivenavigation;
•
•
•
public class MainActivity extends FragmentActivity implements ActionBar.TabListener {
    •
    •
    •
    public static class NonSwipeableViewPager extends ViewPager {
        •
        •
        •
    }
}

这来自本网站的一个样本。我正在尝试做的是将其简化为最基本的原子元素。

具体来说,我想在主活动文件中包含整个示例。

这是我的(非功能性)XML:

<com.example.android.effectivenavigation.MainActivity.NonSwipeableViewPager
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

现在,问题是当我在布局 XML 中指定 ViewPager 时,在解开 NonSwipeableViewPager 元素时会收到“ClassNotFoundException”。

如果我将 NonSwipeableViewPager 设置在一个单独的文件中并相当直接地引用它,它就可以正常工作。当它作为静态类嵌入到主活动类中时,我遇到了问题。

我显然在 XML 中使用了错误的命名空间。

谁能帮我找到要使用的正确命名空间?

谢谢!

【问题讨论】:

  • 使其成为单个文件。
  • 除了作为 StackOverflow 上的副本之外,以您正在做的方式将表示层 (Activity) 与视图层 (NonSwipeableViewPager) 混合是一种糟糕的编程方法。
  • @Budius 是的,我知道。但是,这不是我想要实际使用的东西。我正在学习,原来的例子有很多额外的“杂物”,我正在摆脱这些东西,以便专注于我想要的部分。我实际上是一个非常好的程序员(30 多年的经验)。我对封装的概念相当熟悉。搞定后我会写的代码会非常好。
  • 这只是一个建议。我很高兴您了解正确封装的重要性。但是,请检查链接的问题,它显示了如何指向内部类。
  • @Budius 感谢您指出重复。我在学习 Android 时遇到的问题是 Android 数据的 SNR 很糟糕。差不多1.0。我收到了很多对我的查询的回复,几乎不可能把它整理出来。我敢肯定,随着我的进步,我会变得更好,但我还没有做到。

标签: java android xml


【解决方案1】:

尝试在您的主要活动的 xml 中包含这样的内容:

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
                               xmlns:tools="http://schemas.android.com/tools"
                               android:id="@+id/pager"
                               android:layout_width="match_parent"
                               android:layout_height="match_parent"
                               tools:context="com.example.android.effectivenavigation.MainActivity.NonSwipeableViewPager"/>

希望这会有所帮助。

编辑:我还是新用户,我还没有习惯我的答案应该有多么广泛。下面是我所做的更多示例:

您可以在自定义类中扩展Fragment 并在其中包含onCreateView 方法。此外,您应该为此片段有一个单独的布局 xml(在我的示例中名为 fragment_example)。该方法应该返回一个 View 对象,该对象膨胀片段的布局。这是一个例子:

public static class ExampleFragment extends Fragment {

    static Button b;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_exmaple, container, false);

        b = (Button) rootView.findViewById(R.id.button1);

        b.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //do something
            }
        });

        return rootView;
    }

}

这里是对应的布局xml:

<?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          android:layout_width="match_parent"
          android:layout_height="fill_parent"
          android:orientation="vertical"
          tools:context=".activity_name">

          <Button
            android:layout_width="227dp"
            android:layout_height="40dp"
            android:text="Search"
            android:id="@+id/search"
            android:layout_gravity="center_horizontal"
            android:background="#80ffffff"
            android:textColor="#ffff6b6b"/>

 </LinearLayout>

您还需要一个FragmentPagerAdapter 类来创建片段:

public static class AppSectionsPagerAdapter extends FragmentPagerAdapter {

    public AppSectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int i) {
        switch (i) {

            default:
                return new ExampleFragment();
        }
    }

    @Override
    public int getCount() {
        return 1;
    }
}

最后在你的活动onCreate 方法中你应该有这样的东西:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Create the adapter that will return a fragment for each of the two primary sections
    // of the app.
    mAppSectionsPagerAdapter = new AppSectionsPagerAdapter(getSupportFragmentManager());

    // Set up the ViewPager, attaching the adapter and setting up a listener for when the
    // user swipes between sections.
    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setAdapter(mAppSectionsPagerAdapter);

}

大量基于此:http://developer.android.com/training/implementing-navigation/lateral.html

我希望这可以提供更多详细信息并为您提供更多帮助

【讨论】:

  • 酷。只需指向超类。我很欣赏这个建议。
  • 这不会创建/扩充自定义类。这将使超类膨胀。
  • @Budius 我扩展了我的答案我希望这能提供更好的质量。
  • 嗨@jrsall92 这与新用户或如何在 ViewPager 中创建片段无关。问题是在 XML 布局中使用 android.support.v4.view.ViewPager 并带有指向自定义类的 tools:context 不会使自定义类膨胀。它仍然会膨胀android.support.v4.view.ViewPager。在我标记为重复的问题/答案中,显示了将 XML 布局指向自定义内部类的正确方法。那是&lt;view class="{package}.{ParentClass}${innerClass}" /&gt;
  • @Budius 我并不是说你指的是更好的解决方案,只是说因为他是一个新的 android 开发人员(我也是)并试图创建一个“消费者”,如除了几行,app(我也是),我发现最好使用Android页面给出的例子。再一次,我肯定会检查副本作为学习更好编程的一种方式。
猜你喜欢
  • 1970-01-01
  • 2015-04-24
  • 1970-01-01
  • 2011-03-27
  • 2012-12-24
  • 2011-08-31
  • 2015-06-04
  • 1970-01-01
  • 2016-07-21
相关资源
最近更新 更多