【问题标题】:Having code problems from MainActivity to FragmentActivity从 MainActivity 到 FragmentActivity 的代码问题
【发布时间】:2016-06-21 12:03:41
【问题描述】:

我在 MainActivity 中编写了一个简单的代码,它之前的 xml 代码运行成功。现在,我想制作一个片段并在该片段中运行 MainActivity 代码。我已经尝试了一切,甚至结合了两个代码等,但都是徒劳的。我在下面附上了我的 MainActivity 代码。这是我想在 Fragment 中使用的。我已经知道片段就像一个活动的子活动,并且两者都有单独的 xml,我也知道如何使用。只是无法将旧应用程序中的 MainActivity 代码用作新应用程序中的 FragmentActivity。
1) 需要充当 Fragment 的 MainActivity 代码

package com.ranatalha.userauthority;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;

public class MainActivity
        extends AppCompatActivity
        implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener{

    private TextView mytext;
    private GestureDetector gestureDetector;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); //this is above two lines cox phly content set hoga tbi agy kam hna na
        this.gestureDetector = new GestureDetector(this, this);
        gestureDetector.setOnDoubleTapListener(this); }

//******************Upon clicking the button*************************

    public void changetextshort(View v) {
        mytext = (TextView) findViewById(R.id.mytext);
        mytext.setText("Surpriseeee"); }

    //******************initializing touch event*************************
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        this.gestureDetector.onTouchEvent(event);
        return super.onTouchEvent(event);}

    //******************Implements Methods from alt+ins(0) for touch properties*************************
    @Override
    public boolean onSingleTapConfirmed(MotionEvent motionEvent) {
        mytext.setText("I tapped Once");
        return false;}

    @Override
    public boolean onDoubleTap(MotionEvent motionEvent) {
        mytext.setText("I tapped Twice");
        return false;}

    @Override
    public boolean onDoubleTapEvent(MotionEvent motionEvent) {
        mytext.setText("Double Tap Event Occurred");
        return false;}

    @Override
    public boolean onDown(MotionEvent motionEvent) {
        mytext.setText("Down goes");
        return false;}

    @Override
    public void onShowPress(MotionEvent motionEvent) {
        mytext.setText("I have pressed");}

    @Override
    public boolean onSingleTapUp(MotionEvent motionEvent) {
        mytext.setText("Single Tap Up");
        return false;}

    @Override
    public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
        mytext.setText("I'm Scrolling");
        return false;}

    @Override
    public void onLongPress(MotionEvent motionEvent) {
        mytext.setText("I long pressed");}

    @Override
    public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
        mytext.setText("I FLINNGED");
        return false; }
}


2) 片段代码(MainActivity 现在没有任何代码,除了 Mainactivity 的基本代码,如类名和 OnCreate 代码 - 尽管我在第 3 点也添加了 Mainactivity 代码,实际上几乎需要就像我们在安卓应用中制作片段时那样)

package com.ranatalha.userauthority;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class TopSectionFragment extends Fragment {

    public class Top
            extends AppCompatActivity
            implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener{

        private TextView mytext;
        private GestureDetector gestureDetector;


    //******************Override method oncreateview for fragment*************************
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.top_section_fragment,container, false);
        this.gestureDetector = new GestureDetector(this, this);
        gestureDetector.setOnDoubleTapListener(this);
        return view; //designing of top section fragment completed
         }

//******************Upon clicking the button*************************

        public void changetextshort(View v) {
            mytext = (TextView) findViewById(R.id.mytext);
            mytext.setText("Surpriseeee"); }

        //******************initializing touch event*************************
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            this.gestureDetector.onTouchEvent(event);
            return super.onTouchEvent(event);}

        //******************Implements Methods from alt+ins(0) for touch properties*************************
        @Override
        public boolean onSingleTapConfirmed(MotionEvent motionEvent) {
            mytext.setText("I tapped Once");
            return false;}

        @Override
        public boolean onDoubleTap(MotionEvent motionEvent) {
            mytext.setText("I tapped Twice");
            return false;}

        @Override
        public boolean onDoubleTapEvent(MotionEvent motionEvent) {
            mytext.setText("Double Tap Event Occurred");
            return false;}

        @Override
        public boolean onDown(MotionEvent motionEvent) {
            mytext.setText("Down goes");
            return false;}

        @Override
        public void onShowPress(MotionEvent motionEvent) {
            mytext.setText("I have pressed");}

        @Override
        public boolean onSingleTapUp(MotionEvent motionEvent) {
            mytext.setText("Single Tap Up");
            return false;}

        @Override
        public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
            mytext.setText("I'm Scrolling");
            return false;}

        @Override
        public void onLongPress(MotionEvent motionEvent) {
            mytext.setText("I long pressed");}

        @Override
        public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
            mytext.setText("I FLINNGED");
            return false; }
    }
}


3) MainActivity 代码(将包含 Fragment 子活动)

package com.ranatalha.userauthority;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

public class MainActivity
        extends AppCompatActivity {

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

【问题讨论】:

  • 我已经编辑了我的问题并添加了片段代码 + MainActivity 代码并进行了一些解释。这可能对您理解我的问题更有帮助:)

标签: java android android-fragments fragment android-fragmentactivity


【解决方案1】:

从活动和片段转换代码时要记住的主要事项之一是,您可能必须切换其中使用上下文的事物。
这行:this.gestureDetector = new GestureDetector(this, this); 可能是给您带来麻烦的事情之一。
这个:

GestureDetector(上下文上下文,GestureDetector.OnGestureListener 监听器)

可能是您尝试使用的构造函数。 作为上下文的参数需要从活动中的this 更改为片段中的getContext()(或扩展上下文的东西)。

首先创建片段:
https://developer.android.com/guide/components/fragments.html

// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();


代码示例中提到的容器通常类似于FrameLayout

【讨论】:

  • 现在我已经编辑了我的问题并添加了片段代码+ MainActivity 代码并进行了一些解释。这可能对您理解我的问题更有帮助:)
  • @RanaTalhaTariq 这是否更接近您的需求?
  • 我仍然无法在 Android 中将 Activity 作为片段运行。没有任何 Fragment 的 Activity 100% 正确运行,但如果引入 Fragments,应用确实会打开,但它会在任何类型的屏幕 Activity 上崩溃!
  • @RanaTalhaTariq 你能发布你的堆栈跟踪吗?
【解决方案2】:

不清楚您所说的“制作片段并在该片段中运行 MainActivity 代码”是什么意思...

如果您想启动一个活动并使其覆盖片段,您可以尝试Start an activity from a fragment 中来自 Mceley 的代码

> Intent intent = new Intent(getActivity(), mFragmentFavorite.class);
> startActivity(intent);

【讨论】:

  • 我已经编辑了我的问题并添加了片段代码 + MainActivity 代码并进行了一些解释。这可能对您理解我的问题更有帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-20
  • 2012-04-14
  • 1970-01-01
  • 2016-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多